【问题标题】:How can I update the DataTemplate of a DataGrid.RowDetailsTemplate如何更新 DataGrid.RowDetailsTemplate 的 DataTemplate
【发布时间】: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 已触发。不幸的是,DeviceStatusUnauthorizedConverterDeviceStatusOnlineConverter 再也不会被触发了,所以 RowDetailsTemplate 仍然是前一项。

我做错了什么?

更新

IPC.Device 去掉了不必要的字段:

public class Device
{
    [DataMember]
    public DeviceStatus deviceStatus { get; set; }

    ...
}

你看[DataMember] 因为我在很多地方都使用这种结构,也用于IPC。我有其他属性标记为[DataMember],因此我会将其排除为发生这种情况的原因。 DeviceStatus 是一个枚举。

【问题讨论】:

  • 您能发布您的 IPC.Device 型号代码吗?

标签: c# wpf xaml user-interface


【解决方案1】:

有几种可能。

  • 您可以实现INotifyPropertyChanged Device.deviceStatus,那么你就不需要在里面替换对象了 ObservableCollection,修改属性即可。
  • 可以替换整个ObservableCollection Devices = new ObservableCollection...
  • 您可以删除和插入元素:
    Devices.RemoveAt(i);
    Devices.Insert(i, new Device());

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2013-09-29
  • 1970-01-01
  • 2021-08-13
  • 2011-12-30
  • 1970-01-01
  • 2019-04-12
相关资源
最近更新 更多