2016-04-14 8 views
0

これがWPFまたはCatelについて理解していないかどうかはわかりませんが、異なるノードタイプの3つのデータテンプレートを持つツリービューがあります。 2つのノードタイプを削除ボタンにバインドすることができます。ボタンコマンドのバインディングは、(ノード自体ではなく)親コントロールのビューモデルにバインドされ、ボタンがクリックされたノードのコマンドパラメータが渡されます。私は(全部ここで入力するには大きすぎる)データテンプレートのいずれかの小さなスニペットを提供しています:ノード上のボタンのツリービューバインドCanExecuteの問題

<Grid Margin="10" x:Name="CriteriaGrid"> 
    <TreeView ItemsSource="{Binding Criteria}" > 
    <DataTemplate DataType="{x:Type self:Leaf}"> 
     <Button Command="{Binding Source={x:Reference CriteriaGrid}, Path=DataContext.DeleteLeaf}" 
       CommandParameter="{Binding}">X</Button> 

    </DataTemplate> 
    </TreeView> 
</Grid> 

ViewModelに(再びほんの少しの抽出物):

public class ManageCriteriaViewModel : ViewModelBase 
{ 
    public ManageCriteriaViewModel() 
    { 
     DeleteLeaf = new Command<Leaf>(OnDeleteLeaf, CanDeleteLeaf); 
    } 

    private bool CanDeleteLeaf(Leaf leafNode) 
    { 
     return (leafNode?.Parent as Group) != null; 
    } 

    private void OnDeleteLeaf(Leaf leafNode) 
    { 
     // Some code 
    } 

    public Command<Leaf> DeleteLeaf { get; private set; } 
} 

問題がありますツリーが最初に構築されているとき、コマンドパラメータは常にnullであり、パラメータがnullの場合、私のCanExecuteテストはfalseを返します。私のツリーが最初に表示されると、私のすべてのボタンは無効になります。

しかし、いずれかのボタンをクリックすると、コマンドパラメータが正しく渡されるため、すべてのボタンが再評価され、有効になります。私が追加しようとしている

:UIがロードされているが、これは動作するようには思えないの後にすべてのコマンドを再評価する試みにおいて

protected override Task InitializeAsync() 
{ 
    CommandManager.InvalidateRequerySuggested(); 
    ViewModelCommandManager.InvalidateCommands(true); 
    return base.InitializeAsync(); 
} 

。私はここで何が欠けていますか?

答えて

0

コマンドパラメータとコマンドオブジェクトの順序を切り替えてみます。その理由は、CommandParameterがバインド可能ではなく、変更通知も発生しないためです。したがって、コマンドは「更新」後に再評価されることはありません(初期バインディングプロセスです)。

問題が解決しない場合は、次のようなものでした:提案ヘアートため

protected override async Task InitializeAsync() 
{ 
    await base.InitializeAsync(); 

    _dispatcherService.BeginInvoke(() => ViewModelCommandManager.InvalidateCommands(true);); 
} 
+0

おかげで、私は両方のオプションを試していないし、どちらも動作するようです。おそらく私はより深く潜ってソースをデバッグする必要があります。 InvalidateCommandsがマウスをクリックしたのと同じことをしない理由を説明する覆いの下で何かが起こっている可能性があります。 – Bitfiddler

+0

代わりにパラメータとしてオブジェクトを使用してみてください。その夜は問題を見つけるのに役立ちます –

+0

オブジェクトを使用しようとしましたが、残念ながら、ツリーは最初に表示されたときにはnullです。 – Bitfiddler

関連する問題