配置窗口,不同类型的配置没有绑定错误

本文关键字:配置 绑定 错误 同类型 窗口 | 更新日期: 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}" .../>

ConfigAConfigB实例被设置为视图模型的Config时,这将工作。但是它会显示缺少属性的绑定错误。

我关心的是这种方法是否有效。想象一下100个丢失的属性。这将是地狱负载的绑定错误=在窗口显示之前巨大的延迟。

问题:是否有一个很好的方法来防止绑定错误,如果属性丢失?或者是否有更好的方法来实现给定的场景?

我理解它可以通过使用不同的视图来显示ConfigAConfigB,但我真的很想在一个视图中保持所有可绑定的控件。在我的场景中,将有20多个配置,它们共享一些设置,有些不共享。最后,它将需要创建PropertyGrid的模拟(动态创建视图)或拆分视图太多(直到有从控制到编辑只有一个特定属性的视图)。这就是为什么我更喜欢一些通用的方法"找到绑定-绑定到它,没有找到-跳过,没有问题"

配置窗口,不同类型的配置没有绑定错误

您可以使用转换器。(继承自IValueConverter的类)

你的绑定是这样的

<control.Resources>
        <ConfigConverter x:key="ConfigConverter" />
</control.Resources>
<TextBox Text="{Binding Config, Converter={StaticResource ConfigConverter}, ConverterParameter=ConfigA" .../>

在您的转换器中,您通过反射属性"ConfigA"来查看对象绑定。如果属性存在,则返回值,否则可以返回默认值。