【发布时间】:2019-05-26 21:53:08
【问题描述】:
我的底层数据结构由建立在通用抽象类之上的对象层次结构组成:
public abstract class model {
public string name {get;};
public string type {get;};
}
public class A:model {
public int val1 {get; set;};
}
public class B:model {
public int val2 {get; set;};
}
public class C:B {
public Dictionary<string, int> extra_props;
}
我的目标是创建一个用户界面,在选择对象时能够动态预览,但也能够修改对象的基础属性。
我是 WPF 的绝对菜鸟,所以我不知道它的全部功能是什么。现在关于单值属性,我已经找到了使用数据绑定将属性绑定到 UI 元素的方法。它就像显示和修改值的魅力一样。
<GroupBox x:Name="InfoBox" Header="Object Information">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="41*"/>
<ColumnDefinition Width="200*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
<RowDefinition Height="50*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" Grid.ColumnSpan="2" >
<TextBlock>Name:</TextBlock>
<TextBlock Text="{Binding name}" HorizontalAlignment="Right"></TextBlock>
</DockPanel>
<DockPanel Grid.Row="1" Grid.ColumnSpan="2" >
<TextBlock>Type:</TextBlock>
<TextBlock Text="{Binding type}" HorizontalAlignment="Right"></TextBlock>
</DockPanel>
<DockPanel Grid.Row="2" Grid.ColumnSpan="2" >
<TextBlock>Material Name:</TextBlock>
<TextBlock Text="{Binding val1}" HorizontalAlignment="Right"></TextBlock>
</DockPanel>
</Grid>
</GroupBox>
问题 1:
当绑定B 类型的对象时,val1 属性不存在,并且我在调试输出中收到一些 BindingErrors。这些在执行过程中根本没有问题,但我发现没有办法捕捉它们并返回默认值或其他东西。
我想到的解决此问题的唯一方法是在抽象类中添加所有所需的属性,以便它们都存在于具有一些空值或其他东西的所有派生类上,但这感觉不对全部。
问题 2:
对于像C 这样更复杂的类,我想根据类的属性集/列表动态生成 UI。目前我完全不知道如何使用数据绑定来完成它,除了在 XML 中一一添加它们并解决问题 1 的问题。
我想到的最可行的解决方案是以编程方式生成一个控件并将其添加到主窗口,其中包含我需要的类属性的文本框和输入,并且再次以编程方式希望能够将对象绑定到控件,所以正确读取/设置这些值。显然这种方法也可以解决问题 1。
我什至不确定这个解决方案是否可行,但无论如何我需要建议和建议,主要是关于是否有办法解决我的数据绑定问题,或者我是否应该以编程方式更新用户界面(如果可能)。
【问题讨论】:
标签: c# wpf data-binding