私も似たような状況に陥ったことがあります。2 つのオプションがあります (少なくとも、いつものように):
コマンドのCanExecuteメソッドを使用して、編集するレコードの種類に応じて true または false を返すようにします。CanExecute
値IsEnabled
は、バインド先のコントロールのプロパティを切り替えます。つまり、コントロールを非表示にする場合は、たとえばスタイル トリガーを使用してIsEnabled
、値を値に「プッシュ」する必要があります。Visibility
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</Trigger>
</Style.Triggers>
それが標準的なアプローチだと思いますが、おそらくあなたにとっては理にかなっています。
より動的な状況があり、ボタンを動的に作成したいと考えました。これは、ViewModelで CommandViewModels のコレクションを定義すると、簡単に実行できます。CommandViewModel には、ボタンに表示する name プロパティと実行するコマンドを含めることができます。次に、このコレクションを使用して、ItemsControl にボタンを設定できます。おそらくあなたの状況では少しやり過ぎですが、それはあなたの質問のタイトルを指しており、おそらくあなたはそれを興味深く、ある時点で使用することができます.
つまり、ViewModel は次のようになります。
public class CommandViewModel : ViewModelBase
{
public ICommand Command { get { return ... } }
public string Name { get; set; }
}
public class MainViewModel : ViewModelBase
{
...
ObservableCollection<CommandViewModel> Commands { get; private set; }
public MainViewModel()
{
Commands = new ObservableCollection<CommandViewModel>();
// Creates the ViewModels for the commands you want to offer
PopulateCommands();
}
}
XAML では次のようになります。
<ItemsControl ItemsSource="{Binding Commands}"}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding Command}" Content="{Binding Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
これにより、動的メニューが作成されます...
楽しむ。