我对 WPF 中的数据绑定(bind)非常陌生。
假设我有一个名为 FileSource
的类,它有一个名为 File
的属性(一个字符串)和从中派生的一些其他属性。在我的 GUI 中,我有一个控件,其外观应在两种“模式”之间变化:一种模式是 File
。是null
, 如果不是 null
则为另一种模式.假设一种模式将某些子组件的可见性设置为 Visible
和其他人 Collapsed
,而另一种模式则相反。
我可以想到 3 种方法来解决这个问题:
- 在
FileSource
,创建类型为Visibility
的另一个属性并返回每个控件的正确可见性。但这对我来说听起来很糟糕 - 听起来我会把“模型”(FileSource
) 与 View 的行为(控件)紧密地混合在一起。 - 创建许多琐碎的数据转换类,然后使用模型的语义属性(在本例中为
File
)进行数据绑定(bind)。例如,string
->Visibility
一些组件和另一个的转换器string
->Visibility
其他组件的转换器(返回“相反的”Visibility
值)。这与属性更改通知一起工作并发挥很好的作用,但是为我期望从子控件获得的每种不同响应创建一个新类对我来说听起来不必要地复杂。 - 写一个
Update
方法并订阅PropertyChanged
事件。这对我来说听起来像是在很大程度上打败了数据绑定(bind)的要点。
正确的做法是什么?也许有一种简单的方法可以在 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
。或者,您可以根据需要创建两个类。
最后,您可以使用链接多个值转换器的 ChainConverter
链接转换器。你可以找到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 代码都将简单易读。
并且不要添加所有可能的转换器组合。仅在需要时添加它们。您很可能只需要几个。
关于c# - 如何使用数据绑定(bind)正确更改 WPF 中控件的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693713/