【发布时间】:2020-06-21 11:41:02
【问题描述】:
我是我的视图模型,我有一个 IPC.Device 类型的自定义对象列表,绑定到定义为的属性
private ObservableCollection<IPC.Device> _devices;
public ObservableCollection<IPC.Device> Devices
{
get
{
return _devices;
}
set
{
_devices = value;
RaisePropertyChangedEvent ("Devices");
}
}
我使用 ObservableCollection 来填充 DataGrid,我使用以下 XAML 创建了该数据网格(未显示不必要的部分)
<DataGrid x:Name="MainGrid" ItemsSource="{Binding Path=Devices}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False">
<DataGrid.Columns>
....
<DataGridTemplateColumn Header="{Binding Source={x:Static p:Resources.device_status},
Converter={StaticResource CapitalizeFirstLetterConverter}}"
Width="*" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=deviceStatus, Converter={StaticResource DeviceStatusToStringConverter}, Mode=OneWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
....
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Views:CameraLoginControl Visibility="{Binding Path=deviceStatus, Converter={StaticResource DeviceStatusUnauthorizedConverter}, Mode=OneWay}" />
<Views:TestSelectionControl Visibility="{Binding Path=deviceStatus, Converter={StaticResource DeviceStatusOnlineConverter}, Mode=TwoWay}" />
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
当我更新 ObservableCollection 并用更新后的副本替换项目时,我可以看到 Datagrid 已正确更新,行已更新,DeviceStatusToStringConverter 已触发。不幸的是,DeviceStatusUnauthorizedConverter 和 DeviceStatusOnlineConverter 再也不会被触发了,所以 RowDetailsTemplate 仍然是前一项。
我做错了什么?
更新
IPC.Device 去掉了不必要的字段:
public class Device
{
[DataMember]
public DeviceStatus deviceStatus { get; set; }
...
}
你看[DataMember] 因为我在很多地方都使用这种结构,也用于IPC。我有其他属性标记为[DataMember],因此我会将其排除为发生这种情况的原因。 DeviceStatus 是一个枚举。
【问题讨论】:
-
您能发布您的 IPC.Device 型号代码吗?
标签: c# wpf xaml user-interface