Я использую DependencyProperties неправильно? - PullRequest
3 голосов
/ 17 октября 2010

Я объявил свои свойства зависимостей следующим образом

public bool CanSave
{
    get { return (bool)GetValue(CanSaveProperty); }
    set { SetValue(CanSaveProperty, value); }
}

public static readonly DependencyProperty CanSaveProperty =
    DependencyProperty.Register("CanSave", typeof(bool), typeof(EditorTabViewModel), new PropertyMetadata(false));

В XAML я хочу иметь триггер, который запускает стиль, основанный на значении моего свойства зависимости.В этом случае жирный шрифт, если CanSave истинно

<Style x:Key="CanSaveIndicatorHeader">
    <Style.Triggers>
        <Trigger Property="{Binding CanSave}" Value="True">
            <Setter Property="TextBlock.FontWeight" Value="Bold" />
        </Trigger>
    </Style.Triggers>
</Style>

я получаю сообщение об ошибке

Невозможно установить «Связывание» в свойстве «Свойство» типа «Триггер».».«Связывание» можно установить только для свойства DependencyProperty объекта DependencyObject.

Возможно, я что-то не так делаю.Может кто-нибудь поправить меня?

ОБНОВЛЕНИЕ: В ответ на @Bryan Watts

Хорошо, я сделал что-то вроде

<Style.Triggers>
    <Trigger Property="vm:EditorTabViewModel.CanSave" Value="true">
        <Setter Property="TextBlock.FontWeight" Value="Bold" />
    </Trigger>
    <Trigger Property="vm:EditorTabViewModel.CanSave" Value="false">
        <Setter Property="TextBlock.Foreground" Value="Red" />
    </Trigger>
</Style.Triggers>

Затем я обнаружилчто CanSave никогда не устанавливается в true, тогда я сделал

<TextBox ... Text="{Binding Path=Content, UpdateSourceTrigger=PropertyChanged}" />

, поскольку CanSave установлен в true при изменении содержимого

public string Content
{
    ...
    set
    {
        if ((bool)GetValue(CanSaveProperty) == false)
        {
            SetValue(CanSaveProperty, true);
            RaisePropertyChanged("CanSave");
        } 
        _content = value;
    }
}

Но, кажется,

<Trigger Property="vm:EditorTabViewModel.CanSave" Value="true">

NV происходит, так как шрифт никогда не жирный.Кажется, WPF не обнаруживает изменения?

Ответы [ 3 ]

2 голосов
/ 17 октября 2010

Атрибуту Trigger нужно только имя свойства, а не привязка к нему:

<Trigger Property="CanSave" Value="True">
0 голосов
/ 17 октября 2010

Я обнаружил, что в некоторых (возможно, во всех) случаях, когда триггер используется внутри стиля, вам также необходимо указать противоположный установщик вне триггера: например,:

<Style x:Key="CanSaveIndicatorHeader">
    <Setter Property="TextBlock.FontWeight" Value="Normal" />
    <Style.Triggers>
        <Trigger Property="{Binding CanSave}" Value="True">
            <Setter Property="TextBlock.FontWeight" Value="Bold" />
        </Trigger>
    </Style.Triggers>
</Style>
0 голосов
/ 17 октября 2010

В триггере, который вы определили позднее, значение должно быть Value = "True" вместо Value = "true".

Триггер может быть упрощен, если вы определите целевой тип вашего стиля и затем используетесобственность, которую вы собираетесь связать.Как и в вашем случае вы хотите применить стиль в TextBlock, targetttype - это TextBlock, добавить триггер для свойства Text со значениями «True» и «False», а затем связать свойство Text TextBlock со свойством зависимости (CanSave / Content)

Стиль,

    <Style x:Key="CanSaveIndicatorHeader" TargetType="TextBlock">
        <Style.Triggers>
            <Trigger Property="Text" Value="True">
                <Setter Property="TextBlock.FontWeight" Value="Bold" />
            </Trigger>
        </Style.Triggers>
    </Style>

Переплет,

<TextBlock Style="{StaticResource CanSaveIndicatorHeader}" Text="{Binding CanSave}"/>
...