gpt4 book ai didi

WPF Datagrid 触发器不起作用

转载 作者:行者123 更新时间:2023-12-03 10:34:12 26 4
gpt4 key购买 nike

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

<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>

编辑:添加我的 View 模型的一部分

我正在使用 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

}

最佳答案

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

     <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 不需要以 TwoWay 模式绑定(bind)
<Style.Triggers>
<DataTrigger Value="0" Binding="{Binding Editable,UpdateSourceTrigger=PropertyChanged}">
<Setter Property="Source" Value="{StaticResource imgSadFace}"/>
</DataTrigger>
</Style.Triggers>

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

关于WPF Datagrid 触发器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39621735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com