6

私はtreeViewアイテムのテンプレートを持っています:

<HierarchicalDataTemplate x:Key="RatesTemplate">
    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=ID}"/>
                        <Button CommandParameter="{Binding Path=ID}" 
                                Command="{Binding ElementName=CalcEditView, Path=DataContext.Add}">Add</Button>                            
    </StackPanel>
</HierarchicalDataTemplate>

DataContext として、ID フィールドが null ではない linq エンティティがあります。

問題は: CanExecutedMethod で DelegateCommand 'Add' を使用する場合:

AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute);

一度だけ呼び出され、パラメーターは null です (textBlock は適切な ID 値を示します)。ID プロパティが呼び出される前に CanExecute が呼び出されます (デバッガーで確認)。実際のパラメーターにバインドする前に wpf が canExecute を呼び出していて、それを忘れているようです。バインドが完了し、適切な値が読み込まれると、CanExecute は再度呼び出されません。

回避策として、デリゲートの実行のみでコマンドを使用できます。

Add = new DelegateCommand<int?>(AddExecute);

AddExecute は正しい ID 値で呼び出され、完全に機能しています。しかし、私はまだ CanExecute 機能を使いたいと思っています。何か案は?

4

3 に答える 3

4

このシナリオでは、コマンドのパラメーターとして使用されるプロパティでRaiseCanExecuteChanged()を呼び出すことをお勧めします。あなたの場合、それはあなたのViewModel(またはあなたが使用しているDataContext)のIDプロパティになります。

これは次のようになります。

private int? _id;
public int? ID
{
    get { return _id; }
    set
    {
        _id = value;
        DelegateCommand<int?> command = ((SomeClass)CalcEditView.DataContext).Add;
        command.RaiseCanExecuteChanged();
    }
}

効果はソリューションと同じですが、コマンドロジックをコードビハインドから遠ざけます。

于 2011-10-14T09:50:14.730 に答える
2

CommandManager.InvalidateRequerySuggestedを使用して強制的に更新を試みることができます。

于 2009-11-17T13:21:33.800 に答える