在WPF中重用Bindings的任何方法?

时间:2010-01-26 15:11:39

标签: wpf binding variables resources reusability

我在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>

是否有类似的类似功能或技术允许我声明绑定源一次然后重复使用?

3 个答案:

答案 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 } 上的DataContextWindow上的StackPanel

答案 1 :(得分:0)

  

是否有任何方法可以在资源中编写绑定的源部分,然后通过使用更紧凑的语法引用它来重用它。

也许你可以用PyBinding做到这一点。我不知道它的功能范围,但我一直使用它来避免类型转换器。这是我经常使用的一个例子。

Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}"
  • BooleanToVisibility是我在IronPython中编写的一个函数。
  • $ [.InstanceName]绑定到当前数据绑定项的InstanceName属性。

编辑:您也可以使用它将一个UI的属性绑定到另一个UI。以下是帮助文件中的一些信息。

  • $ [NameTextBlock.Text] - x的元素的text属性:Name等于“NameTextBlock”
  • $ [NameTextBlock] - 一个实际的TextBlock实例,而不是其中一个属性
  • $ [{Self}] - 与自己绑定。相当于{Binding RelativeSource = {RelativeSource Self}}
  • $ [{Self} .Text] - 您自己的Text属性。相当于{Binding Path = Text,RelativeSource = {RelativeSource Self}}

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>