我有一个Grid,Visibility属性绑定到父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中已经设置的扩展器的绑定。
我考虑将其翻转过来,使目标是我的视图模型,而源是网格(绑定到Visibility),并将MyProperty设置为依赖属性。但是,我的视图模型不是DependencyObject,所以我不能这样做。
我曾尝试使用MultiBinding/MultiConverter绑定网格。对扩展器的可见性。IsExpanded和MyProperty,但这没有达到预期效果MyProperty不会更改为网格。时的可见性。可见性展器而更新。IsExpanded更改。
唯一可行的选项是在Grid上使用一个附加属性,该属性绑定到Expander.IsExpanded,然后使用回调函数以编程方式更改Grid.Visibility(只要附加属性更改)网格。可见性然后绑定到MyProperty。这似乎是一种混乱的方式,但我愿意接受建议。
我想我要做的几乎就像一个双管齐下的绑定,其中两个绑定方向相反,一个是从依赖属性到CLR属性的。
感谢您的帮助!!
我认为您可以在扩展器和绑定网格上使用触发器来设置网格的可见性。ViewModel的可见性。这种方法类似于使用代码隐藏的解决方案,但使用触发器而不是代码。
在我看来,您的代码隐藏解决方案也足够好了。谁说一切都必须在XAML中,而不是代码背后。代码隐藏通常不利于业务逻辑等,但如果不能仅用XAML表示,那么在代码隐藏中包含视觉逻辑是完全可以的。