WPF не работает Binding на FontSize внутри DataTemplate

117
23 декабря 2020, 22:20

Здравствуйте! Программа написанна на WPF MVVM с использованием фреймворка caliburn Micro. Возникла необходимость динамически менять размер шрифта элемента в ListView.

Данная привязка на FontSize не отрабатывает

<GridViewColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="dgffsdgf" FontSize="{Binding Path= FontSizeTb8X2, UpdateSourceTrigger=PropertyChanged}"/>
    </DataTemplate>
</GridViewColumn.CellTemplate>

а такая работает нормально:

<TextBlock Name="CurrentFontString" Margin="10" MinHeight="20" FontSize="{Binding Path= FontSizeTb8X2, UpdateSourceTrigger=PropertyChanged}"/>

и такая тоже

<Style x:Key="ListHeaderStyle8X2" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="FontSize" Value="{Binding Path= FontSizeTb8X2, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
</Style>

КОД View

<Style x:Key="ListHeaderStyle8X2" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="FontSize" Value="{Binding Path= FontSizeTb8X2, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
</Style>
<StackPanel>
    <Button Name="FontChoser" Content="ШРИФТ"/>
    <TextBlock Name="CurrentFontString"/>
    <ListView Name="TestListViewFonts">
        <ListView.View>
            <GridView ColumnHeaderContainerStyle="{StaticResource ListHeaderStyle8X2}">
                <GridViewColumn  Header="Номер">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="dgffsdgf" FontSize="{Binding Path= FontSizeTb8X2, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</StackPanel>

КОД ViewModel

private float _fontSizeTb8X2;
public float FontSizeTb8X2
{
    get { return _fontSizeTb8X2; }
    set
    {
        _fontSizeTb8X2 = value;
        NotifyOfPropertyChange(() => FontSizeTb8X2);
    }
}

//Окно настройки шрифта из WinForms
public void FontChoser()
{
    var fontDialog = new FontDialog { Font = CurrentFont };
    if (fontDialog.ShowDialog() == DialogResult.OK)
    {   
        FontSizeTb8X2 = fontDialog.Font.Size;
        CurrentFontString= $@"{FontSizeTb8X2}";
    }
}
Answer 1

Привязка не срабатывает, т.к. ListView (как и любой ItemsControl) устанавливает контекст своим дочерним элементам на сами элементы привязанной коллекции. Свойства FontSizeTb8X2 в этом контексте, естественно, нет. Поэтому вам нужно использовать RelativeSource для указания точного пути к этому свойству, например:

FontSize="{Binding Path=DataContext.FontSizeTb8X2,
        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window},
        UpdateSourceTrigger=PropertyChanged}"

или чуть-чуть короче:

FontSize="{Binding DataContext.FontSizeTb8X2,
        RelativeSource={RelativeSource FindAncestor, AncestorType=Window},
        UpdateSourceTrigger=PropertyChanged}"
READ ALSO
Отложенный запуск программ C#

Отложенный запуск программ C#

Как можно после завершения основной программы запустить файл батник который создался при завершении программы, я сделал через процесс старт...

110
Разбиение команд на 6 групп по 4 в каждой

Разбиение команд на 6 групп по 4 в каждой

Пытался сделать, но ввиду while, долго думает программа и вообще наверное способ мой плохой

91
Окно поверх других WinApi, C#

Окно поверх других WinApi, C#

Всем привет, автоматизирую программу для клиентаТ

127