我在WPF应用程序中已经到了这一点,我的控件上的所有绑定都变得非常重复,而且有点过于冗长。此外,如果我想更改此绑定,我将不得不在各个地方而不是一个地方更改它。
是否有任何方法可以在资源中编写绑定的源部分,然后通过使用更紧凑的语法引用它来重用它。我四处寻找这些能力,但我还没有找到它。
我现在在做什么
<StackPanel>
<ToggleButton x:Name="someToggleButton" />
<Button Visibility="{Binding ElementName=someToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}" />
<Grid Visibility="{Binding ElementName=someToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}" />
<TextBox Visibility="{Binding ElementName=someToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}" />
<CheckBox Visibility="{Binding ElementName=someToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}" />
</StackPanel>
我希望能做什么(伪代码)
<StackPanel>
<StackPanel.Resources>
<Variable x:Name="someToggleButtonIsChecked"
Type="{x:Type Visibility}"
Value="{Binding ElementName=someToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}" />
</StackPanel.Resources>
<ToggleButton x:Name="someToggleButton" />
<Button Visibility="{VariableBinding someToggleButtonIsChecked}" />
<Grid Visibility="{VariableBinding someToggleButtonIsChecked}" />
<TextBox Visibility="{VariableBinding someToggleButtonIsChecked}" />
<CheckBox Visibility="{VariableBinding someToggleButtonIsChecked}" />
</StackPanel>
是否有类似的类似功能或技术允许我声明绑定源一次然后重复使用?
答案 0 :(得分:1)
您可以将someToggleButton
的{{1}}属性绑定到viewmodel(DataContext)上的属性并使用它。它看起来像这样:
IsChecked
这将要求您的<StackPanel>
<ToggleButton x:Name="someToggleButton" IsChecked="{Binding ToggleVisibility, Mode=TwoWay, Converter={StaticResource BoolToVisibilityConverter}}" />
<Button Visibility="{Binding ToggleVisibility}" />
<Grid Visibility="{Binding ToggleVisibility}" />
<TextBox Visibility="{Binding ToggleVisibility}" />
<CheckBox Visibility="{Binding ToggleVisibility}" />
</StackPanel>
Window
拥有DataContext
类型ToggleVisibility
的属性。
修改强>
进一步说,您的viewmodel可能如下所示:
Visibility
然后,您可以将其设置为public class SomeViewModel : INotifyPropertyChanged
{
private Visibility toggleVisibility;
public SomeViewModel()
{
this.toggleVisibility = Visibility.Visible;
}
public Visibility ToggleVisibility
{
get
{
return this.toggleVisibility;
}
set
{
this.toggleVisibility = value;
RaisePropertyChanged("ToggleVisibility");
}
}
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
上的DataContext
或Window
上的StackPanel
答案 1 :(得分:0)
是否有任何方法可以在资源中编写绑定的源部分,然后通过使用更紧凑的语法引用它来重用它。
也许你可以用PyBinding做到这一点。我不知道它的功能范围,但我一直使用它来避免类型转换器。这是我经常使用的一个例子。
Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}"
编辑:您也可以使用它将一个UI的属性绑定到另一个UI。以下是帮助文件中的一些信息。
http://pybinding.codeplex.com/
未经考试的理论
<StackPanel>
<ToggleButton x:Name="someToggleButton" />
<Button Visibility="{p:PyBinding BooleanToVisibility($[someToggleButton.IsChecked])}" />
<Grid Visibility="{p:PyBinding BooleanToVisibility($[someToggleButton.IsChecked])}"/>
<TextBox Visibility="{p:PyBinding BooleanToVisibility($[someToggleButton.IsChecked])}"/>
<CheckBox Visibility="{p:PyBinding BooleanToVisibility($[someToggleButton.IsChecked])}"/>
</StackPanel>
第二次尝试
<StackPanel>
<ToggleButton x:Name="someToggleButton" />
<Button Name="myButton" Visibility="{p:PyBinding BooleanToVisibility($[someToggleButton.IsChecked])}" />
<Grid Visibility="{p:PyBinding $[myButton.Visibility]}"/>
<TextBox Visibility="{p:PyBinding $[myButton.Visibility]}"/>
<CheckBox Visibility="{p:PyBinding $[myButton.Visibility]}"/>
</StackPanel>
答案 2 :(得分:0)
只需查看原始代码,您就可以将必要的元素分组到自己的容器中,然后管理容器可见性:
<StackPanel>
<ToggleButton x:Name="someToggleButton" />
<StackPanel Visibility="{Binding ElementName=someToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}">
<Button />
<Grid />
<TextBox />
<CheckBox />
</StackPanel>
</StackPanel>
实际上,今天我会用VSM执行此操作 - 具有Visible元素的状态和不可见的状态,然后在Toggle按钮上使用两个GoToState Behaviors根据按钮的切换状态设置状态。 / p>