值更改时未触发 Datagrid 数据触发器

Datagrid datatrigger not fired when value changes

我有一个 dataGridwith 列绑定到数据中的某些列 table

<DataGrid x:Name="WatchersGrid" ItemsSource="{Binding GroupWatchers}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedItem}" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding  Path=[Name]}"/>
                        <DataGridTextColumn Header="Value" Binding="{Binding Path=[Value]}">
                            <DataGridTextColumn.ElementStyle>
                                <Style>
                                    <Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>
                        <DataGridTextColumn Header="InRange" Binding="{Binding [IsInRange]}"/>
            </DataGrid.Columns>
                    <DataGrid.RowStyle>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding [IsInRange]}" Value="False">
                                    <Setter Property="Foreground" Value="Crimson"></Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.RowStyle>
        </DataGrid>

我在 "IsInRange" 列上有一个数据触发器,如果​​值为 false,它会将前景 属性 设置为红色。 数据网格列中的值发生变化,但颜色 属性 改变。 我试图 NotifyPropertyChanged("[IsInRange]");当我的价值正在改变但那没有帮助时 有什么想法吗?

编辑: 我的视图模型

public class WatcherControlViewModel : INotifyPropertyChanged
{
  private DataTable _dt;
  private string _groupName;
  public DataRow[] GroupWatchers{get {return _dt.Select("Group = '" + GroupName + "'");}}
  public WatcherControlViewModel(DataTable dt, string name)
    {
        _dt = dt;
        _groupName = name;
       _dt.RowChanged += DataTableChangedEvent;
    }

    private void DataTableChangedEvent(object sender, DataRowChangeEventArgs e)
    {
        NotifyPropertyChanged("GroupWatchers");
        NotifyPropertyChanged("IsInRange");
    }
}

谢谢

你试过不用方括号吗?您的模型是否实现了 INotifyPropertyChanged 接口? 如果您 post 在该视图背后编写代码,可能会有所帮助。

这实际上取决于您的 ViewModel 以及您如何绑定它。根据你的 XAML,你的 ViewModel 应该看起来像这样:

public class MyViewModel
{
    public DataTable WatchersGrid { get; set; }

    public MyViewModel()
    {
        WatchersGrid = new MyDataTable();
    }
}

您的绑定应如下所示:

public partial class Window1 : Window
{
    private MyViewModel vm;

    public Window1()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        vm = new MyViewModel();
        DataContext = vm;
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        vm.WatchersGrid.Rows[0]["IsInRange"] = !(bool)vm.WatchersGrid.Rows[0]["IsInRange"];
    }
}

注意测试按钮。出于测试目的,它仅针对第一行在 truefalse 之间切换 IsInRange 值。

结果: