0

我有一个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 / MultiConverter将Grid.Visibility绑定到Expander.IsExpandedMyProperty,但这并没有达到预期的效果。当Grid.Visibility由于Expander.IsExpanded更改而更新时, MyProperty不会更改为Grid.Visibility

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

我想我想要做的几乎就像一个双管齐下的绑定,其中两个绑定方向相反,一个来自依赖属性,另一个来自CLR 属性。

感谢您提供的任何帮助!

4

1 回答 1

0

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

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

于 2012-03-30T10:58:43.990 回答