7

コントロールのすべてのバインディングが非常に反復的になり、少し冗長になりすぎている WPF アプリケーションのポイントに到達しています。また、このバインドを変更したい場合は、1 つだけではなく、さまざまな場所で変更する必要があります。

リソースなどでバインディングのソース部分を一度書き、それをよりコンパクトな構文で参照して再利用する方法はありますか。そのような機能を探しましたが、見つかりませんでした。

私が今していること

<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

のプロパティをビューモデル (DataContext)someToggleButtonのプロパティにバインドして、それを使用するだけです。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> 

これには、タイプという名前WindowDataContextプロパティが含まれている必要があります。ToggleVisibilityVisibility

編集:

さらに洗練させるために、ビューモデルは次のようになります。

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

于 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] - プロパティの 1 つではなく、実際の 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> 

2 回目の試行

<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 でこれを行います。Visible 要素の状態と Visible でない状態を用意し、トグル ボタンで 2 つの GoToState 動作を使用して、ボタンのトグル状態に基づいて状態を設定します。

于 2010-08-10T15:03:50.997 に答える