3

レコードを作成および編集できる単純なwpf-mvvmアプリケーションがあります。このようなもの:

例

新しいレコードを作成する場合は、「作成」ボタンと「キャンセル」ボタンがあります。既存のレコードを編集する場合は、「編集」、「削除」、「キャンセル」ボタンがあります。

2つの異なる形式を使用したくありません。1つを使用して、表示するボタンを選択できる動的メニューを作成したいと思います。

xamlは次のようになります。

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
    <Button MinWidth="93" Command="{Binding CreateCommand}>
        Create
    </Button>
    <Button MinWidth="93" Command="{Binding EditCommand}>
        Edit
    </Button>
    <Button MinWidth="93" Command="{Binding DeleteCommand}>
        Delete
    </Button>
    <Button MinWidth="93" Command="{Binding CancelCommand}>
        Cancel
    </Button>
</StackPanel>

これを行うための最良の方法は何ですか?

4

2 に答える 2

3

私も似たような状況に陥ったことがあります。2 つのオプションがあります (少なくとも、いつものように):


コマンドのCanExecuteメソッドを使用して、編集するレコードの種類に応じて true または false を返すようにします。CanExecuteIsEnabledは、バインド先のコントロールのプロパティを切り替えます。つまり、コントロールを非表示にする場合は、たとえばスタイル トリガーを使用して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>

これにより、動的メニューが作成されます...


楽しむ。

于 2013-03-06T07:47:12.083 に答える
0

MVVM を使用している場合は、Create、edit、delete、および cancel コマンドを含む DataContext である ViewModel があります。

ViewModel にレコードのインスタンスを持たせます。編集する場合は、編集するインスタンスを渡します。null に設定されたレコードを作成するための Else。

コマンドを作成し、渡されたレコードが null かどうかを CanExecute 機能でチェックします。(null は新しいレコードの作成、それ以外の場合は編集を表します)。コマンドの CanExecute を false に設定すると、それにバインドされたボタンは自動的に無効になります。

于 2013-03-06T07:41:23.347 に答える