您可以做一些事情,但我不会将它们描述为既不是更清洁/更短的实现方式。MVVM
如果您使用一种方法,它们很容易实现。
您可以做的第一件事是摆脱RelativeSource/AncestorType
绑定中的 以查找绑定属性的位置。如果您的两个/所有控件(尚不清楚您使用多少个控件)将共享相同的视图模型,您可以将相同的视图模型属性绑定到views:LeftNavControl.Selected
,以及所有切换的可见性控件。
您可以做的第二件事是一种更激进的方法,可以清理您的 xaml,它也会使您myCustomConverter
过时,但会在您的视图模型中移动一些业务逻辑。这在您有大量Polygons
需要可见性切换的 /other 控件时效果最好。您可以在视图模型中有一个StepXVisiblity
属性,并且您可以在每次views:LeftNavControl.Selected
更改时计算它,并且您的 Polygon(s) xaml 将如下所示:
<Polygon Visibility="{Binding StepXVisiblity}">
上述解释的一个简单示例是:
<StackPanel>
<TextBox Text="{Binding Step, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="One" Visibility="{Binding StepOneVisible}" />
<TextBlock Text="One" Visibility="{Binding StepOneVisible}" />
<TextBlock Text="Two" Visibility="{Binding StepTwoVisible}" />
<TextBlock Text="Two" Visibility="{Binding StepTwoVisible}" />
</StackPanel>
视图模型:
public class MyVM : DomainBase
{
private int step;
public int Step
{
get
{
return step;
}
set
{
step = value;
OnPropertyChanged("Step");
OnPropertyChanged("StepOneVisible");
OnPropertyChanged("StepTwoVisible");
}
}
public Visibility StepOneVisible
{
get
{
return step == 1 ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility StepTwoVisible
{
get
{
return step == 2 ? Visibility.Visible : Visibility.Collapsed;
}
}
}