值更改时未触发 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"];
}
}
注意测试按钮。出于测试目的,它仅针对第一行在 true
和 false
之间切换 IsInRange
值。
结果:
我有一个 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"];
}
}
注意测试按钮。出于测试目的,它仅针对第一行在 true
和 false
之间切换 IsInRange
值。
结果: