7

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

是否有任何类似类型的类似功能或技术可以让我声明一次绑定源然后重用它?

4

3 回答 3

1

您可以将someToggleButtonIsChecked属性绑定到视图模型(DataContext)上的属性并使用它。它看起来像这样:

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

这将要求您WindowDataContext有一个名为ToggleVisibilitytype的属性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
}

然后你可以将它的一个实例设置为DataContexton theWindow甚至只是 on theStackPanel

于 2010-01-26T15:20:02.867 回答
0

有没有办法将绑定的源部分编写一次,例如在资源中,然后通过使用更紧凑的语法引用它来重用它。

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

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

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

  • $[NameTextBlock.Text] - x: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> 
于 2010-01-26T22:00:58.797 回答
0

只需查看原始代码,您可以将必要的元素分组到自己的容器中,然后管理容器的可见性:

<StackPanel>
    <ToggleButton x:Name="someToggleButton" />
    <StackPanel Visibility="{Binding ElementName=someToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}">
        <Button />
        <Grid />
        <TextBox />
        <CheckBox />
    </StackPanel>
</StackPanel>

实际上,今天我将使用 VSM 执行此操作 - 具有元素可见的状态和元素不可见的状态,然后在切换按钮上使用两个 GoToState 行为来根据按钮的切换状态设置状态。

于 2010-08-10T15:03:50.997 回答