【问题标题】:Configuration window, different types of configuration without binding errors配置窗口,不同类型的配置无绑定错误
【发布时间】:2015-08-25 12:07:14
【问题描述】:

配置窗口。很多选择。并且在同一个窗口中显示许多不同的配置:

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 时,这将起作用。但它会显示 missing 属性的绑定错误。

我担心这种方法是否有用。想象一下 100 个缺失的属性。那将是大量的绑定错误 = 显示窗口之前的巨大延迟。

问题:如果缺少属性,是否有防止绑定错误的好方法?或者也许有更好的方法来实现给定的场景?

我了解通过使用 不同 视图来显示 ConfigAConfigB 可以完成什么,但我真的很想将所有可绑定控件保留在 1 个视图中。在我的场景中,将有 20 多个配置,它们共享一些设置,有些则不共享。最后,它将需要创建PropertyGrid 的类似物(以动态创建视图)或过多地拆分视图(一直到存在由控件组成的视图以仅编辑一个特定属性)。这就是为什么我更喜欢一些通用方法“找到绑定 - 绑定到它,未找到 - 跳过,没问题”

【问题讨论】:

    标签: c# wpf mvvm binding


    【解决方案1】:

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

    你的绑定看起来是这样的

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多