私は wpf ツリービューでコンテキスト メニューを使用しています。問題を説明する前に、コンテキスト メニューの XAML 定義が何をしているのかを説明しましょう。
コンテキスト メニューの各メニュー項目には、コマンドの CanExecute メソッドに基づいてメニュー項目を無効または有効にするコマンドがあります。各コマンドは、CanExecute の結果に応じて、対応するメニュー項目の IsEnabled プロパティを設定します。
各メニュー項目の IsEnabled は BooleanToVisibilityConverter にバインドされ、IsEnabled bool 値を Collapse または Visible 値に変換して、メニュー項目の Visibility プロパティにバインドされます。これも正常に機能し、メニュー項目は正常に表示および非表示になっています。
さて、問題です。以下の XAML では、セパレータの上に 2 つのメニュー項目 (addCategoryMenuItem と removeCategoryMenuItem) があります。IMultiValueConverter (MultiBooleanToVisibilityConverter) のカスタム実装を介して、これら 2 つのメニュー項目の IsEnabled プロパティに MultiBinding しようとしています。これにより、2 つのメニュー項目が無効になっているときに Separator の Visibility プロパティを折りたたみに設定できるため、メニュー項目は無効です。
私の Converter(MultiBooleanToVisibilityConverter) の Convert メソッドでは、パラメーター値 (オブジェクト [] 値) の値「{DependencyProperty.UnsetValue}」を保持する配列内の 2 つの項目を取得します。これらはブール値にキャストできないため、Visibility 値を計算できません。
おそらく、MultiBinding で使用される ElementName と関係があります。要素が見つかりませんか?RelativeSource を使用してみました。つまり、祖先などを見つけましたが、混乱しました。私はこれに何時間も費やしてきたので、今はコミュニティに任せています。
敬具
ムハンマド
<ContextMenu x:Key="CategoryMenu">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type Control}">
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self}, Mode=OneWay, Converter={StaticResource booleanToVisibilityConverter}}" />
</Style>
</ContextMenu.ItemContainerStyle>
<ContextMenu.Items>
<MenuItem x:Name="addCategoryMenuItem" Header="add category" Command="{Binding AddCategory}">
<MenuItem.Icon>
<Image Source="/Images/add.png" Width="16" Height="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="removeCategoryMenuItem" Header="remove category" Command="{Binding RemoveCategory}">
<MenuItem.Icon>
<Image Source="/Images/remove.png" Width="16" Height="16" />
</MenuItem.Icon>
</MenuItem>
<Separator>
<Separator.Visibility>
<MultiBinding Converter="{StaticResource multiBooleanToVisibilityConverter}">
<Binding Mode="OneWay" ElementName="addCategoryMenuItem" Path="IsEnabled" />
<Binding Mode="OneWay" ElementName="removeCategoryMenuItem" Path="IsEnabled" />
</MultiBinding>
</Separator.Visibility>
</Separator>
<MenuItem x:Name="refreshCategoryMenuItem" Header="refresh" Command="{Binding RefreshCategory}">
<MenuItem.Icon>
<Image Source="/Images/refresh.png" Width="16" Height="16" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu.Items>
</ContextMenu>