1

作成しているTreeViewがあり、各アイテムにContextMenuを追加しています。問題は、私のViewModelで、TreeViewItemSourceがViewModel自体のプロパティにバインドされていることです。ViewModelの一部のプロパティを再度参照しようとすると、機能しないようです。

<TreeView Grid.ColumnSpan="1" Grid.Row="1" HorizontalAlignment="Stretch" ItemsSource="{Binding ModelItems}" SelectedTreeItem="{Binding SelectedItem, Mode=TwoWay}" VerticalAlignment="Stretch" Grid.RowSpan="3" Margin="5">
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Models}">
        <TextBlock Text="{Binding Header, Mode=TwoWay}"  ToolTip="{Binding Tooltip, Mode=TwoWay}">
            <TextBlock.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Server" Visibility="{Binding Path=IsServerVisible}">
                        <MenuItem Header="Add" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Windows:MainWindow}}, Path=ViewModel:ViewModel.AddServerCommand}"/>
                        <MenuItem Header="Edit" />
                        <MenuItem Header="Delete" />
                    </MenuItem>
                    <MenuItem Header="Config" Visibility="{Binding Path=IsConfigVisible}">
                        <MenuItem Header="Fetch" />
                        <MenuItem Header="Edit" />
                        <MenuItem Header="Save" />
                    </MenuItem>     
                </ContextMenu>
            </TextBlock.ContextMenu>
        </TextBlock>
    </HierarchicalDataTemplate>                
</TreeView.ItemTemplate>

StackOverflowに関する以前の投稿では、RelativeSourceを使用してメインウィンドウのViewModelに正しくバインドする方向を示しました。ただし、アプリケーションを実行すると、コマンドが機能せず、出力ウィンドウでバインディングエラーやxamlエラーが生成されません。

基本的に、Visibilityバインディングは、これらのプロパティが「モデル」アイテムに存在するために機能します。ただし、すべてをViewModel、特にコマンドに移動する必要があります。

誰かが私が間違って行ったことをここで見つけることができますか?

4

3 に答える 3

3

ここで覚えておくべき重要なことは、コンテキストメニューはビジュアルツリーの一部ではないということです

したがって、バインドのために属するコントロールと同じソースを継承しません。これに対処する方法placement targetは、ContextMenu自体のにバインドすることです。ただし、ViewModelクラスのCommandにバインドする必要があるためDataContext in Tag、TextBlockのを配置し、次のようにコマンドBindingで使用します-

<HierarchicalDataTemplate ItemsSource="{Binding Models}">
    <TextBlock Text="{Binding Header}"
               Tag="{Binding DataContext, RelativeSource=
               {RelativeSource Mode=FindAncestor, AncestorType=Window}}">
         <TextBlock.ContextMenu>
              <ContextMenu>
                  <MenuItem Header="Server" Command="{Binding 
                            PlacementTarget.Tag.AddServerCommand,
                            RelativeSource={RelativeSource Mode=FindAncestor, 
                            AncestorType=ContextMenu}}"/>
               </ContextMenu>
          </TextBlock.ContextMenu>
      </TextBlock>
</HierarchicalDataTemplate>

上記と同様に他のバインディングに使用すると、希望どおりに機能します。

于 2012-11-15T06:16:28.883 に答える
0

完全な.xamlを投稿しなかったため、ツリービューのデータコンテキストを使用してみましょう。RelativeSourceはTreeViewへのアクセスを提供しているため、ViewModelへの参照であるため、バインディングパスでDataContextを使用する必要があります。

Command="{Binding Path="DataContext.AddServerCommand" RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeView}}}"
于 2012-11-15T02:38:42.950 に答える
0

それ以外の

<MenuItem Header="Add" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Windows:MainWindow}}, Path=ViewModel:ViewModel.AddServerCommand}"/>

試す

<MenuItem Header="Add" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Windows:MainWindow}}, Path=DataContext.AddServerCommand}"/>

あなたのViewModelはあなたのDataContextではありませんか?

于 2012-11-15T04:25:41.033 に答える