配置窗口,不同类型的配置没有绑定错误
本文关键字:配置 绑定 错误 同类型 窗口 | 更新日期: 2023-09-27 18:09:39
配置窗口。有很多选择。和许多不同的配置显示在同一个窗口:
public class BaseConfig: INotifyPropertyChanged {}
public class ConfigA: BaseConfig
{
public SomeType OptionA { get {...} set {...}}
}
public class ConfigB: BaseConfig
{
public SomeOtherType OptionB { get {...} set {...}}
}
视图模型:
public class ViewModel: INotifyPropertyChanged
{
public BaseConfig Config {get {...} set {...}}
}
和观点:
<TextBox Text="{Binding Config.OptionA}" .../>
<TextBox Text="{Binding Config.OptionB}" .../>
当ConfigA
或ConfigB
实例被设置为视图模型的Config
时,这将工作。但是它会显示缺少属性的绑定错误。
我关心的是这种方法是否有效。想象一下100个丢失的属性。这将是地狱负载的绑定错误=在窗口显示之前巨大的延迟。
问题:是否有一个很好的方法来防止绑定错误,如果属性丢失?或者是否有更好的方法来实现给定的场景?
我理解它可以通过使用不同的视图来显示ConfigA
和ConfigB
,但我真的很想在一个视图中保持所有可绑定的控件。在我的场景中,将有20多个配置,它们共享一些设置,有些不共享。最后,它将需要创建PropertyGrid
的模拟(动态创建视图)或拆分视图太多(直到有从控制到编辑只有一个特定属性的视图)。这就是为什么我更喜欢一些通用的方法"找到绑定-绑定到它,没有找到-跳过,没有问题"。
您可以使用转换器。(继承自IValueConverter的类)
你的绑定是这样的
<control.Resources>
<ConfigConverter x:key="ConfigConverter" />
</control.Resources>
<TextBox Text="{Binding Config, Converter={StaticResource ConfigConverter}, ConverterParameter=ConfigA" .../>
在您的转换器中,您通过反射属性"ConfigA"来查看对象绑定。如果属性存在,则返回值,否则可以返回默认值。