WPF:绑定Grid.Visibility OneWay到依赖属性和OneWayToSource到视图模型CLR属性

时间:2012-03-29 15:35:40

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

我有一个 Grid 可见性属性绑定到父 Expander 控件的 IsExpanded

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

这是我的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 的绑定。

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

我尝试使用 MultiBinding / MultiConverter 绑定 Grid.Visibility Expander.IsExpanded MyProperty ,但这并没有达到预期的效果。当 Grid.Visibility Expander.IsExpanded <而更新 Grid.Visibility 时, MyProperty 无法更改为 Grid.Visibility / strong>改变。

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

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

感谢您提供任何帮助!!

1 个答案:

答案 0 :(得分:0)

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

在我看来,你的代码背后的解决方案也足够好了。谁说一切都​​必须在XAML中而不是代码隐藏。代码隐藏对于业务逻辑通常是不利的,但如果它不能仅在XAML中表示,那么在代码隐藏中使用可视逻辑就完全没问题了。