【问题标题】:WPF Datagrid Trigger doesn't workWPF Datagrid 触发器不起作用
【发布时间】:2016-09-21 16:19:44
【问题描述】:

我将数据网格绑定到一个 ObservableCollection 项目,这些项目确实实现了 INotifyPropertyChanged。 只有一列是可编辑的。另一列是我想根据列中编辑的值自动更改的图像。它不起作用。例如,如果我单击行标题(排序),它会刷新,但不是在编辑后立即刷新

<DataGrid ItemsSource="{Binding ItemRows,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" AutoGenerateColumns="False" 
                  CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="false">

            <DataGrid.Columns>
                <DataGridTextColumn Header="Editable" Binding="{Binding Editable, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Image x:Name="imgComplete" Width="20" Height="20">
                                <Image.Style>
                                    <Style TargetType="{x:Type Image}">
                                        <Setter Property="Source" Value="{StaticResource imgCheckmarkOrange}" />
                                        <Style.Triggers>
                                            <DataTrigger Value="0" Binding="{Binding Editable,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                                                <Setter Property="Source" Value="{StaticResource imgSadFace}"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Image.Style>
                            </Image>                                                                                             
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>                        
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

编辑:添加部分视图模型

我正在使用 FODY,我的结构非常复杂,所以我只发布与数据网格源相关的内容

[ImplementPropertyChanged]
public class MyViewModel 
{

....
    public ObservableCollection<StockOrderRow> ItemRows { get; set; } = new ObservableCollection<StockOrderRow>();

.....


}

此集合加载了数据库中有关另一个属性更改的数据

“StockOrderRow”类

    public class StockOrderRow : BaseEntity
    {
    public string Field1{ get; set; } = "";
    ...

    public int Editable { get; set; } = 0;



    }

还有“BaseEntity”类

public class BaseEntity: INotifyPropertyChanged
    {
    public string Id { get; set; }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {

        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

}

【问题讨论】:

  • 请发布您的视图模型代码。

标签: wpf mvvm datagrid


【解决方案1】:

我建议为您的 Editable 属性使用 DataGridTemplateColumn。有了这个,您可以直接在 TextBox 中处理与 PropertyChanged 的​​绑定。

     <DataGridTemplateColumn>
         <DataGridTemplateColumn.CellTemplate>
             <DataTemplate>
                <TextBlock Text="{Binding Editable}" />
             </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
         <DataGridTemplateColumn.CellEditingTemplate>
             <DataTemplate>
                <TextBox Text="{Binding Editable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
             </DataTemplate>
         </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>

第二件事是您的 ItemsClasses 属性 Editable 必须调用 OnPropertyChange

public class StockOrderRow:BaseEntity
{
    public string Field1{ get; set; } = "";

    private int _editable = 0;
    public int Editable { 
        get { return _editable; } 
        set {
            if(value == _editable) return;

            // Debug.WriteLine("Editable set. OldVal: " + _editable + "; NewVal:" + value);
            _editable = value;
            OnPropertyChanged(nameof(Editable));
        } 
    }
}

您的 DataTrigger 不需要在 Mode TwoWay 中绑定

<Style.Triggers>
    <DataTrigger Value="0" Binding="{Binding Editable,UpdateSourceTrigger=PropertyChanged}">
        <Setter Property="Source" Value="{StaticResource imgSadFace}"/>
    </DataTrigger>
</Style.Triggers>

如果这不起作用,我将在 Editable 的设置器处开始调试(并检查在输入 TextBox 时属性是否更新...)。

【讨论】:

  • 这行得通,谢谢!现在我看到了以前没有看到的内容:我的行模型类正在实现 INotifyPropertyChanged,但没有引发属性更改事件。我也将在那里添加 Fody,因为这个字段只是一个示例,还有更多字段和其他类。我有我的模型,只是带有字段,位于 View/ViewModels 的单独项目中,因为它们可以重复用于另一个界面也是如此。在模型和视图模型中实现 INotifyPropertyChanged 是典型的吗?
猜你喜欢
  • 2013-01-05
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多