【问题标题】:WPF: Binding Grid.Visibility OneWay to a dependency property and OneWayToSource to a view model CLR propertyWPF:将 Grid.Visibility OneWay 绑定到依赖项属性,将 OneWayToSource 绑定到视图模型 CLR 属性
【发布时间】:2012-04-13 07:06:03
【问题描述】:

我有一个 GridVisibility 属性绑定到父 Expander 控件的 IsExpanded

每当 Grid.Visibility 发生变化时,我希望 DataContext(视图模型)上的属性 (MyProperty) 相应地发生变化。

这是我的 XAML:

<Grid Visibility="{Binding IsExpanded, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Converter={StaticResource BoolToVisibilityConverter}}" />

我已尝试使用以下方法在视图构造函数中以编程方式设置绑定:

grid.SetBinding(VisibilityProperty, new Binding("MyProperty") { Source = DataContext });

但是,这只是替换了与 XAML 中已设置的 Expander 的绑定。

我考虑过翻转它,以便目标是我的视图模型,而源是网格(绑定到 Visibility)并将 MyProperty 变成依赖属性。但是,我的视图模型不是 DependencyObject,所以我不能这样做。

我尝试使用 MultiBinding / MultiConverterGrid.Visibility 绑定到 Expander.IsExpandedMyProperty,但这并没有达到预期的效果。当 Grid.Visibility 由于 Expander.IsExpanded 而更新时,MyProperty 不会更改为 Grid.Visibility > 变化。

似乎唯一可行的选择是使用 Grid 上的附加属性,该属性绑定到 Expander.IsExpanded,然后使用回调函数以编程方式更改 Grid .Visibility 每当附加属性发生变化时。 Grid.Visibility 然后绑定到 MyProperty。这似乎是一种混乱的方式,但我愿意接受建议。

我想我正在尝试做的几乎就像一个双管齐下的绑定,其中两个绑定方向相反,一个是 from 依赖属性,另一个是 to 一个 CLR 属性。

感谢您提供的任何帮助!

【问题讨论】:

    标签: wpf dependency-properties multibinding attached-properties isoneway


    【解决方案1】:

    我认为您可以使用 Expanders 上的触发器设置网格的可见性并将 grid.Visibility 绑定到您的 ViewModel。这种方法类似于您的解决方案,但使用的是触发器而不是代码。

    在我看来,您的代码背后的解决方案也足够好。谁说一切都​​必须在 XAML 中而不是在代码隐藏中。代码隐藏通常对业务逻辑等不利,但如果不能仅在 XAML 中表达,则在代码隐藏中具有可视化逻辑是完全可以的。

    【讨论】:

    • 从包含 ExpanderDataTrigger 设置 Grid.Visibility 不合适,因为这意味着 Expander 必须知道子 Grid。使用 FindAncestor 绑定的关键在于您希望元素对父元素做出反应,而无需父元素知道子元素。 ExpanderUserControl 的一部分,它有一个 ContentPresenter,其中可能没有 Grid。我的编程解决方案不能解决我的问题,因为正如我所提到的,它只是替换了与 XAML 中已设置的 Expander 的绑定;它不会聚合它。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2020-12-22
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多