プラグイン作成者がプラグインを構成するための独自のユーザーインターフェイスを定義できる設定エディターを作成しています。チェックボックスがオフの場合、特定の「高度な」要素を非表示にする機能を実装しています。
チェックボックスXAMLは簡単です。
<CheckBox Name="isAdvanced">_Advanced</CheckBox>
理想的には(これについては後で詳しく説明します)、実装者は次のように高度なコントロール([詳細]チェックボックスがオフの場合は非表示にする必要があります)にフラグを追加するだけです。
<Button library:MyLibraryControl.IsAdvanced="True">My Button</Button>
IsAdvanced="True"
問題は、要素を非表示にする魔法を作ることにありますisAdvanced.IsChecked == false
。私はウィンドウ要素でこのスタイルで望ましい振る舞いをしています:
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding (library:MyLibraryControl.IsAdvanced), RelativeSource={RelativeSource Mode=Self}}" Value="True" />
<Condition Binding="{Binding IsChecked, ElementName=isAdvanced}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="UIElement.Visibility" Value="Collapsed" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
ただし、この方法には2つの問題があります。
- ボタンに機能を追加するだけで、他には何も追加しません。フラグは、任意の視覚要素
IsAdvanced
に追加できます(追加できるはずです) 。 - ボタンにあるスタイルを置き換え/オーバーライドします。
必要な機能を作成する他の方法はありますか?コードビハインドで作業することを恐れていませんが、エレガントなXAMLソリューションが理想的です(これは、ユーザーの設定でチェックボックスの状態を保存することを除けば、純粋にUIの変更であるため)。
高度な要素を表す他のいくつかの方法が思い浮かびました。これには、動的リソースの使用と直接バインディングが含まれます。
<Button Visibility="{DynamicResource IsAdvancedVisibility}">My Button</Button>
<Button Visibility="{Binding IsChecked, RelativeSource={...}, ValueConverter={...}}">My Button</Button>
リソースディクショナリを使用することはおそらく機能しますが、UI状態がディクショナリに属するべきではないように見えるため、これは本当に悪い解決策のようです。チェックボックスの状態を何らかの方法で要素に送信する必要があるため、手動でバインドすることは非常に混乱します。値をハードコーディングすることを除けば、混乱しないように見えます。
これらの代替ソリューションは両方とも、セマンティクス(「これは高度なオプションです」)を外観(「高度なオプションは折りたたむ必要があります」)に結び付けます。HTMLの世界から来た私は、これが非常に悪いことであることを知っています。絶対に必要な場合を除いて、これらのメソッドを送信することを拒否します。