あるコレクションの現在のアイテムの一部にcommand
プロパティがバインドされているボタンがあるとします。ICommand
コレクションがのnull
場合、ボタンは有効なままで、クリックしても何も起こらないようです。代わりに、ボタンを無効のままにしておく必要があります。コレクションがnullの場合は常にボタンを無効にしておくために、次のことがわかりました。ただし、より自然で、より単純で、よりMVVMのようなもので実現できる可能性があるものには少し複雑すぎるようです。
したがって、質問:理想的にはコードビハインドが使用されていない場合に、そのボタンを無効に保つためのより簡単な方法はありますか?
.xaml:
<Button Content="Do something" >
<Button.Command>
<PriorityBinding>
<Binding Path="Items/DoSomethingCmd" />
<Binding Path="DisabledCmd" />
</PriorityBinding>
</Button.Command>
</Button>
.cs:
public class ViewModel : NotificationObject
{
ObservableCollection<Foo> _items;
public DelegateCommand DisabledCmd { get; private set; }
public ObservableCollection<Foo> Items {
get { return _items; }
set { _items = value; RaisePropertyChanged("Items"); }
}
public ViewModel()
{
DisabledCmd = new DelegateCommand(DoNothing, CantDoAnything);
}
void DoNothing() { }
bool CantDoAnything()
{
return false;
}
}
編集:
いくつかのメモ:
- ラムダ式を使用できることは承知していますが、このサンプルコードでは使用できません。
- 私は述語が何であるかを知っています。
- 現在のアイテムがない間はアクセスできないので、何かを
DoSomethingCmd.CanExecute
することがどのように役立つかわかりません。DoSomethingCmd
- だから私は私の質問を再び中心に置きます:どうすれば使用を避けることができ
DisabledCmd
ますか?DoSomethingCmd
それは私が探しているものではないので、私は上に移動することに興味がありません。そうでなければ、私はこの質問をしません。
別の編集:
だから私は基本的にこの答えを解決策として採用しました:WPF / MVVM:UserControlの背後にあるViewModelがまだ初期化されていないときにボタンの状態を無効にしますか?
それはまさにhbarckが提案していることだと私は信じています。