加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用数据绑定正确更改WPF中的控件状态?

发布时间:2020-12-16 02:03:13 所属栏目:百科 来源:网络整理
导读:我对 WPF中的数据绑定很新. 假设我有一个名为FileSource的类,它有一个名为File(一个字符串)的属性和一些从中派生的属性.在我的GUI中,我有一个控件,其外观应该在两个“模式”之间变化:一个模式,如果File为null,另一个模式,如果它不为null.假设一种模式将某些
我对 WPF中的数据绑定很新.

假设我有一个名为FileSource的类,它有一个名为File(一个字符串)的属性和一些从中派生的属性.在我的GUI中,我有一个控件,其外观应该在两个“模式”之间变化:一个模式,如果File为null,另一个模式,如果它不为null.假设一种模式将某些子组件的可见性设置为Visible,将其他组件设置为Collapsed,而另一种模式则相反.

我可以想出3种解决方法:

>在FileSource中,创建另一个Visibility类型的属性,并为每个控件返回正确的可见性.但这对我来说听起来非常糟糕 – 听起来我会将“模型”(FileSource)与视图(控件)的行为紧密混合在一起.
>创建大量简单的数据转换类,然后使用模型的语义属性(在本例中为File)进行数据绑定.例如,字符串 – >某些组件的可见性转换器和另一个字符串 – >可见性转换器(返回其他组件的“相反”可见性值).这适用于属性更改通知,但是对于我期望从子控件发出的每种不同响应创建一个新类对我来说是不必要的.
>编写Update方法并订阅PropertyChanged事件.这听起来像我将在很大程度上打败数据绑定点.

这样做的正确方法是什么?或许,有一种简单的方法可以在XAML中内联进行数据“转换”(对于我打算读取的值,但不能写回源)?

解决方法

您不需要太多的转换器类.您只需要一个BoolToVisibilityConverter,但具有指定true和false可见性值的属性.您创建这样的实例:

<BoolToVisibilityConverter x:Key="ConvertBoolToVisible"
    FalseVisibility="Collapsed" TrueVisibility="Visible" />
<BoolToVisibilityConverter x:Key="ConvertBoolToVisibleInverted"
    FalseVisibility="Visible" TrueVisibility="Collapsed" />

另一个转换器是IsNullConverter.您可以使用bool InvertValue等属性对其进行参数化.在资源字典中,实例可以称为ConvertIsNull和ConvertIsNotNull.或者,如果您愿意,可以创建两个类.

最后,您可以使用链式转换器链接转换器,链式转换器链接多个值转换器.你可以找到sample implementation in my private framework(permalink).有了它,您可以在XAML中创建转换器实例,如ConvertIsNotNullToVisibleInverted.样品用法:

<a:ChainConverter x:Key="ConvertIsNotNullToVisible">
    <a:ValueConverterRef Converter="{StaticResource ConvertIsNotNull}"/>
    <a:ValueConverterRef Converter="{StaticResource ConvertBoolToVisible}"/>
</a:ChainConverter>

另一种方法是使用触发器.但是XAML代码会更复杂,所以我更喜欢转换器.它需要编写一些类,但它是值得的.使用这样的体系结构,每个组合都不需要几十个类,C#和XAML代码都是简单易读的.

并且不要添加所有可能的转换器组合.只在您需要时添加它们.最有可能的是,你只需要几个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读