Как использовать DataTrigger для установки свойства, определенного в ViewModel в WPF - PullRequest
9 голосов
/ 26 января 2011

Я пишу XAML-файл, который использует DataTrigger для установки свойства в ViewModel.Класс ViewModel, определенный как:

public class ShellModel : INotifyPropertyChanged
{    
    public Brush ForegroundBrush
    {
        get; set;
    }

    ....................
}

Я хочу использовать DataTrigger в View.xaml, чтобы установить свойство ForegroundBrush.XAML, который я написал:

<StatusBar Name="statusBar" Grid.Row="3">
    <StatusBarItem>
        <StatusBarItem.Style>
            <Style>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding HasError}" Value="True">
                        <Setter Property="ForegroundBrush" Value="Red" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding HasError}" Value="False">
                        <Setter Property="ForegroundBrush" Value="Black" />
                    </DataTrigger>
                        </Style.Triggers>
            </Style>
        </StatusBarItem.Style>
        <TextBlock Name="statusBarMessage" Foreground="{Binding ForegroundBrush}" Text="{Binding StatusMessage}"></TextBlock>
     </StatusBarItem>
     ........................

Это не компилируется.Когда я изменил

     <Setter Property="ForegroundBrush" Value="Black" />     

на

     <Setter Property="ShellModel.ForegroundBrush" Value="Black" />

, выдает ошибку:

Поле свойства зависимости отсутствует ....

Как мне написать это, чтобы DataTrigger мог установить свойство ForegroundBrush во ViewModel?

1 Ответ

7 голосов
/ 26 января 2011

Установщики в ваших DataTriggers должны изменять свойства только ваших элементов пользовательского интерфейса (а также они работают только с DependencyProperties).
Установите свойство Foregound вашего StatusBarItem напрямую и установите TargetType стиля.Это должно помочь.

   <Style TargetType="{x:Type StatusBarItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding HasError}" Value="True">
                <Setter Property="Foreground" Value="Red" />
            </DataTrigger>
            <DataTrigger Binding="{Binding HasError}" Value="False">
                <Setter Property="Foreground" Value="Black" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

Наличие информации о визуальном представлении в вашей ViewModel, как правило, не очень хорошая идея.

...