【问题标题】:Datagrid datatrigger not fired when value changes值更改时未触发 Datagrid 数据触发器
【发布时间】:2016-02-06 11:31:09
【问题描述】:

我有一个 dataGrid,其列绑定到数据表中的某些列

<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");
    }
}

谢谢

【问题讨论】:

  • 实际上,它对我有用....请告诉你ViewModel class。
  • 当我第一次添加值时它对我有用,但是如果我更改数据表中的值它不会更新,在我的视图模型中我有 'public DataRow[] GroupWatchers{get {返回 _dt.Select("Group = '" + GroupName + "'");}}' 这是 itemsource 并且我更改了代码中的一些 _dt 值。在我改变后,我提出' NotifyPropertyChanged("GroupWatchers"); NotifyPropertyChanged("[IsInRange]");'
  • 你不需要 INotifyPropertyChangedGroupWatchers 应该是公共的 DataTable 属性,getset,而不是 DataRow[]。请在我的帖子中查看如何操作。
  • 对不起,我忘了我在 get 中对 dt 进行了选择,我不想只显示具有相同组名的整个 dt
  • 您的自定义类只需要INotifyPropertyChangedDataTable 已经足够“聪明”了。

标签: c# wpf data-binding datagrid datatrigger


【解决方案1】:

这真的取决于您的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 值,用于测试目的。

结果:

【讨论】:

    【解决方案2】:

    你试过不带方括号吗?您的模型是否实现了 INotifyPropertyChanged 接口? 如果您在该视图后面发布代码可能会有所帮助。

    【讨论】:

    • 是的,我的 viewmodel 在后面的代码中实现了 INotifyPropertyChanged,我用 row["IsInRange"] = false; 更改了数据表的值;在某些数据行中。删除方括号没有帮助@yoger
    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多