1

コンテキスト メニューがあり、特定の時点で、コンテキスト メニュー項目にバインドされているコマンドの一部を無効にします。

何が機能するか:

コマンドが無効になると、メニュー項目をクリックしても、コマンドの実行メソッドが呼び出されません。

機能しないもの:

実行できるコマンドと実行できないコマンドの両方が同じに見えます!! 私のユーザーは違いを見分けることができません。

問題:

この変更を表示するスタイルを変更するにはどうすればよいですか。背景色、境界線の色、前景色、ツールチップの変更...何でも受け入れられます..

xaml を試してみましたが、これを解決できませんでした。(私はxamlの初心者なので、ここに貼り付ける価値さえありません:))

xaml:

<Border BorderThickness="1" MinWidth="100"  Background="Transparent"  ContextMenu="{Binding Path=ContextMenu}" BorderBrush="{Binding Path=BorderColor}">

バインディング:

public override ContextMenu ContextMenu
        {
            get
            {
                return new ContextMenu
                           {
                               ItemsSource = new ObservableCollection<MenuItem>
                                                 {
                                                     new MenuItem
                                                         {
                                                             Header = IsSharedFieldView? "Delete Shared Field" :"Delete Field" ,
                                                             Command = DeleteFieldCommand 
                                                         }
                                                 }
                           };

            }
        }
4

3 に答える 3

3

ここでの秘訣は、ContextMenu が実際には ItemsControl を継承していることです。これは私のマシンで機能します。

/// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.DataContext = this;
            InitializeComponent();

            MenuItems = new ObservableCollection<KeyValuePair<string, ICommand>>();
            MenuItems.Add(new KeyValuePair<string, ICommand>("One", OneCommand));
            MenuItems.Add(new KeyValuePair<string, ICommand>("Two", null));
        }

        public ObservableCollection<KeyValuePair<String, ICommand>> MenuItems { get; set; }

        #region OneCommand
        DelegateCommand _OneCommand;
        public DelegateCommand OneCommand
        {
            get { return _OneCommand ?? (_OneCommand = new DelegateCommand(One, CanOne)); }
        }

        public bool CanOne()
        {
            return false;
        }

        public void One()
        {

        }
        #endregion
    }

そしてXAML:

<Window x:Class="DynamicContextMenuTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Path Data="M 10,2 L 17.5,2 L 17.5,0 L 23,4.5 L 17.5,9 L 17.5,7.3 L 10,7.3 L 10,2" Fill="Green">
            <Path.ContextMenu>
                <ContextMenu ItemsSource="{Binding MenuItems}" DisplayMemberPath="Key">
                    <ContextMenu.Resources>
                        <Style TargetType="MenuItem">
                            <Setter Property="Command" Value="{Binding Value}" />
                            <Style.Triggers>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter Property="Background" Value="Red" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </ContextMenu.Resources>
                </ContextMenu>
            </Path.ContextMenu>
        </Path>
    </Grid>
</Window>

いくつかのことに注意してください。

  • ContextMenu (ビューモデルはコントロールを認識するべきではありません) にバインドしなくなり、代わりにstring(Header)/ ICommand(Command)のコレクションにバインドします。
  • 項目のコマンドCanExecuteが false を返すと、バインドされたコントロールのIsEnabledプロパティは false になります。そのプロパティにトリガーを設定して、バインドされたコントロールの外観を変更できます。
于 2012-07-20T12:01:37.427 に答える
1
    <Window.Resources>
        <Style TargetType="{x:Type MenuItem}">
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Background" Value="Black"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <TextBox >
            <TextBox.ContextMenu>
                <ContextMenu>
                    <Menu>
                        <MenuItem Header="Add" IsEnabled="False"/>
                        <MenuItem Header="Delete"/>
                    </Menu>
                </ContextMenu>
            </TextBox.ContextMenu>
        </TextBox>
    </Grid>

単なるデモであり、これからアイデアを得ることができます。IsEnabled を VM Command.CanExecute にバインドできます。これが役立つことを願っています。

于 2012-07-20T12:00:22.123 に答える
0

うまくいった解決策:

最初に、ビュー モデルから ContextMenu をバインドしていましたが、isEnabled が機能していませんでした。

その代わりに、xaml でコンテキスト メニューを作成し、viewModel から itemsSource をバインドしました。

メニュー項目が無効になり、トリガーが機能するようになりました。

何が間違っていたのかわかりませんが、これで修正されました:)

于 2012-07-23T10:00:59.477 に答える