【问题标题】:WPF - How can I disable Binding based on object property?WPF - 如何禁用基于对象属性的绑定?
【发布时间】:2015-12-25 09:22:46
【问题描述】:

我有一个复杂的对象绑定到 DevExpress 网格,带有自定义 EditTemplate

<ControlTemplate x:Key="EditLine">
    <StackPanel  VerticalAlignment="Center">
        <TextBox Text="{Binding RowData.Row.Value}"
                 Margin="2"
                 Visibility="{Binding RowData.Row.ParamType, Converter={StaticResource ValueTypeToVisibilityConverter}, ConverterParameter='TextBox'}" />
        <CheckBox Visibility="{Binding RowData.Row.ParamType, Converter={StaticResource ValueTypeToVisibilityConverter}, ConverterParameter='CheckBox'}"
                  IsChecked="{Binding RowData.Row.Value}"
                  VerticalAlignment="Center"
                  HorizontalAlignment="Center" />
    </StackPanel>
</ControlTemplate>

我的复杂对象值可以加密也可以不加密,所以该对象有一个属性 IsEncrypted(它是布尔值)。我的第一个想法是创建一个转换器来解密显示的值并在保存时对其进行加密,并仅将其绑定到另一个文本框,该文本框仅在布尔值为真时显示。

但是,使我的加密文本框可见性折叠并不能阻止绑定,并创建一些除了阻止窗口显示(我无法修改加密函数的行为,因为它在其他应用程序中使用了很多地方,它必须抛出例外)...

由于无法绑定ConverterParameter,如何实现我的目标?

【问题讨论】:

  • 是否可以创建某种视图模型类并将此类绑定到您的 xaml?在视图模型类中,您可以有一个可以绑定到的“DisplayValue”属性。此属性可以检查原始值是否已加密,并且可以(连同其他属性)帮助您创建比“原始”数据更容易绑定的数据。
  • 我怎么能忘记这个想法.. 谢谢,我围绕我的复杂对象创建了一个包装视图模型来处理这种情况!
  • 好的,那么我将为此创建一个简短的答案

标签: c# wpf binding converter


【解决方案1】:

为了避免复杂的 XAML 标记检查原始数据的复杂条件,通常最好创建某种视图模型类并将此类绑定到 XAML。

在视图模型类中,您可以拥有一个可以绑定到的“DisplayValue”属性。此属性可以检查原始值是否已加密,并且可以(与其他属性一起)帮助您创建比“原始”数据更容易绑定的数据。

通过这样做,您的视图与视图模型之间的绑定更像是“1:1”(控件到属性)绑定。然后可以在视图模型中完成从原始数据到显示方式的转换。

【讨论】:

    【解决方案2】:

    您可以创建自己的自定义 MultiBinding。将其绑定到 Value 和 IsEncrypted,并在那里进行特殊处理(即,如果 IsEncrypted 为 true,则忽略 Value)。

    【讨论】:

    • 是的,我虽然在这个解决方案中,但是如何实现“ConvertBack”,因为,我希望我的布尔值知道我是否必须加密......
    • 您能准确解释一下您要做什么吗?我不明白“我希望我的布尔值知道我是否必须加密”是什么意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多