gpt4 book ai didi

c# - 父对象的 WPF 中的数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:23:58 27 4
gpt4 key购买 nike

我有一个 TreeView 我正在填充并向每个项目添加一个 ContextMenu。问题是在我的 ViewModel 中,TreeView ItemSource 绑定(bind)到 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 正确绑定(bind)到 MainWindow 上的 ViewModel 的方向。但是,当我运行该应用程序时,该命令不起作用,并且“输出”窗口没有生成任何我可以看到的绑定(bind)或 xaml 错误。

基本上可见性绑定(bind)有效,因为这些属性存在于“模型”项上。但是,我希望将所有内容都移至 ViewModel,尤其是 Command。

谁能发现我在这里做错了什么?

最佳答案

这里要记住的关键是上下文菜单不是可视树的一部分 .

因此,它们不会继承与它们所属的用于绑定(bind)的控件相同的源。处理这个问题的方法是绑定(bind)到 placement target ContextMenu 本身。但是由于您想在 ViewModel 类中为 Command 绑定(bind)它,所以放置 DataContext in Tag你的 TextBlock 并在你的命令中使用这样的绑定(bind) -

<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>

用于与上述类似的其他绑定(bind),它将按照您的意愿工作。

关于c# - 父对象的 WPF 中的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com