通过数据模板在后备存储中将 DependencyProperty 设置为 UI - 后备存储未更新
本文关键字:存储 设置 UI 更新 DependencyProperty 数据 | 更新日期: 2023-09-27 18:36:57
我的后备存储中有以下 DP 包装 InputEnabled 属性:
public EnableDisableSetting InputEnabled
{
get { return (EnableDisableSetting)this.GetValue(InputEnabledProperty); }
set { this.SetValue(InputEnabledProperty, value); }
}
public static readonly DependencyProperty InputEnabledProperty = DependencyProperty.Register("InputEnabled", typeof(EnableDisableSetting), typeof(EMSBasicDevice));//, new PropertyMetadata(EnableDisableSettings.Enabled));
我还有另一个对象结构,其中填充了我们用于控制 DataGrid 的行和列的各种参数:
public class DeviceDisableEnable
{
private EnableDisableSetting _Individual_EnDis;
public EnableDisableSetting Individual_EnDis
{
get { return _Individual_EnDis; }
set { _Individual_EnDis = value; }
}
}
(省略了大部分字段,仅显示相关字段)
在运行时,此结构使用后备存储中的值填充:
public void LoadDeviceDisable()
{
DeviceDisableEnable dde;
// Third Line
dde = new DeviceDisableEnable(this);
dde.RowHeight = 21;
dde.DataDescription = this.Inputs[0].Name;
dde.ZoneText = InZoneID.ShortName;
dde.LocationText = Inputs[0].LocationTexts[0];
dde.Individual_EnDis = this.Inputs[0].InputEnabled;
dde.Ind_Enable_Text = this.Inputs[0].InputEnabled.Description;
dde.IsHeader = false;
dde.ShowIndEnable = true;
dde.ShowAllEnable = true;
DeviceDisablesList.Add(dde);
所以值 dde。Individual_EnDis从 DP 获取后备存储值。这工作正常。
显示的结构用于在 UI 中生成数据网格。结构中的每个条目表示网格中的一列。下面是生成与此条目关联的列的代码:
// Add a component for the Enable/Disable property
DataGridTemplateColumn EnableCol = new DataGridTemplateColumn();
Binding IndivBind = new Binding("Individual_EnDis");
IndivBind.Mode = BindingMode.TwoWay;
IndivBind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
IndivBind.Converter = new EMSDevices.EnabledDisabledConverter();
Binding bind3 = new Binding("IsHeader");
bind3.Mode = BindingMode.TwoWay;
bind3.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
FrameworkElementFactory dtContent2 = new FrameworkElementFactory(typeof(EMS_Config_Tool.UIComponents.WPF.DeviceDisableWidget));
ImageTemplate = new DataTemplate();
EnableCol.CellTemplate = ImageTemplate;
EnableCol.Width = new DataGridLength(140);
EnableCol.CanUserSort = false;
ImageTemplate.VisualTree = dtContent2;
dtContent2.SetBinding(EMS_Config_Tool.UIComponents.WPF.DeviceDisableWidget.SetValueProperty, IndivBind);
dtContent2.SetValue(EMS_Config_Tool.UIComponents.WPF.DeviceDisableWidget.TextProperty, Properties.Resources.GroupEditor_Enabled);
dtContent2.SetValue(EMS_Config_Tool.UIComponents.WPF.DeviceDisableWidget.TitleProperty, Properties.Resources.Device_Edit_042);
dtContent2.SetBinding(EMS_Config_Tool.UIComponents.WPF.DeviceDisableWidget.TitleVisibilityProperty, bind3);
EnableCol.CellStyle = visible_style;
TheDataGrid.Columns.Add(EnableCol);
抱歉,这有点复杂,但是有一些有趣的显示需求超出了基本DataGrid
,所以这里有一些技巧来显示正确的东西。重要的一点是如何对DeviceDisableEnable
结构中的Individual_EnDis
属性进行绑定。到目前为止一切顺利,一切都醒了,至少是一种方式,但遗憾的是不是两种方式。通过单击Checkbox
更改 UI 中的值实际上确实会更新 DDE 结构中的设置---但---,最后是问题所在,后备存储不会更新,因此尽管有一个 DP 包装后备存储中的属性,但该 DP 不会"波纹"DDE 结构以让后备存储由 UI 更新, 换句话说,使用中介结构仅呈现属性的值,而不是属性本身。显然,我需要更改DDE结构以正确引用后备存储DP属性,但是现在如何进行,我不知道。
亲爱的.....好吧,我已经回答了我自己的问题,显然我已经混淆了这个问题,超出了显而易见的解决方案。
如果网格是从中间数据模板填充的,则更改后备存储中的数据不会对中间结构产生任何影响,除非也更新了中间结构。因此,我需要做的就是使用新的数据值更新中间结构,并调用 [DataGrid]。Items.Refresh() 和网格将更新以显示新的数据条目。当然,这可能不是最有效的,因为大多数行在此事务中不会更改,因此我需要做的就是仅对受影响的条目调用 Refresh 方法,我已经知道它们是哪些条目,因为我刚刚更新了它们在中间结构中的值。最有可能的是,使用 iNotifyPropertyChanged 通知,当后备存储中发生更改时,我可以直接刷新中间结构,然后将其传播到 DataGrid。