1

カスタムのパネルがありますListViewListView'sアイテムにはGroupBox. にはGroupBoxが含まれていListViewます。このListView'sアイテムには、などが含まGroupBoxれます。

上記のすべてのコントロールには、カスタム テンプレートとスタイルがあります。

ToggleButtonsControls VisualTree に最下位ノードがあります。これらのボタンがチェックされている場合、ボタンがクリックされた以外のすべてのパネルを無効にする必要があります。

viewModel クラスの親を介したイベント チェーンを回避したいと考えています。

私は mvvm パターンを使用していますが、可能であれば xaml 側で解決したいと考えています。

編集:これはスクリーンショットであり、選択ボタンはパネルを無効にする必要があります

ここに画像の説明を入力

どんな提案も大歓迎です。

4

2 に答える 2

1

以下のような相対ソースバインディングを実装する必要があります。

IsEnabled="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}},Path=IsEnabled}"
于 2012-08-10T12:09:09.903 に答える
0

ViewModel に、ToggleButton がバインドされているプロパティの否定である読み取り専用プロパティを設定するだけです。

ビューモデル:

private Boolean mSourceIsPicked;
public Boolean SourceIsPicked
{
    get { return mSourceIsPicked; }
    set 
    { 
        SetProperty("SourceIsPicked", ref mSourceIsPicked, value); 
        NotifyPropertyChanged("IsSourceChangeable");
    }
}

public Boolean IsSourceChangeable
{
    get { return ! this.SourceIsPicked; }
}

次に、ビューで、他のコントロールの IsEnabled プロパティをその新しいプロパティにバインドします。

<ComboBox ItemsSource="{Binding SourceTypes}"
          IsEnabled={Binding IsSourceChangeable}" />

プロパティにバインドする利点は、ビューでコントロールを追加/削除し、追加の XAML を変更せずにこのプロパティにバインドできることです。このプロパティにバインドしないことで、任意のコントロールの動作を変更することもできます。

本当に XAML のみのソリューションが必要な場合は、パネル内の各コントロールに名前を付け、"SourceIsPicked" プロパティで TargetName を使用して DataTrigger を使用して、他のコントロールを無効にすることができます。

<ComboBox x:Name="cboSourceTypes" ... />
<ComboBox x:Name="cboSourceNames" ... />
<ToggleButton>
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SourceIsPicked}" Value="True">
                    <Setter TargetName="cboSourceTypes" 
                            Property="IsEnabled" 
                            Value="False" />
                    <Setter TargetName="cboSourceNames" 
                            Property="IsEnabled" 
                            Value="False" />
                </DataTrigger>
            </Style.Triggers>
         </Style>
    </ToggleButton.Style>
</ToggleButton>

これはすべてフリーハンドであるため、少し調整する必要があるかもしれませんが、アイデアが得られることに注意してください。

于 2012-08-10T13:11:47.190 に答える