我在文本框上有一个上下文菜单,我试图将 isChecked 属性绑定到该文本框的 datacontext 中的属性之一,并使用值转换器。
我遇到的问题与这篇文章非常相似,我相信... WPF MenuItem.Command 绑定到 ElementName 结果到 System.Windows.Data 错误:4:找不到参考绑定的源
在那里,Aran Mulholland 提出了 3 种不同的解决方案。我一直在努力工作,但还没有看到实际工作示例的是#2。我认为这是对 MVVM 最友好的方法,为此最优雅的方法……再说一次,我对此很陌生。
这是我的xml
<DataTemplate x:Key="SFTemplateWithContextMenu">
<TextBlock x:Name="Field" Text="{Binding Path=FieldName}" >
<TextBlock.ContextMenu>
<!--<ContextMenu PlacementTarget="{Binding ElementName=Field}" > -->
<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=PlacementTarget.DataContext}">
<MenuItem Header="Rename..." />
<MenuItem Header="Field Type">
<MenuItem.Resources>
<Configurator:EnumToBooleanConverter x:Key="EnumToBooleanConverter" />
</MenuItem.Resources>
<!--<MenuItem Header="String" IsCheckable="True" IsChecked="{Binding Path=PlacementTarget.DataContext.FieldType, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static Configurator:TypeDesc.String}, PresentationTraceSources.TraceLevel=High}"/>-->
<MenuItem Header="String" IsCheckable="True" IsChecked="{Binding Path=FieldType, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static Configurator:TypeDesc.String}, PresentationTraceSources.TraceLevel=High}"/>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
我正在使用 DataTemplate 填充以下列表框...
<ListBox DnD:DragDropHelper.IsDragSource="True" Name="sourceFieldsLB" Height="238" HorizontalAlignment="Left" Margin="20,286,0,0" VerticalAlignment="Top" Width="150" ItemTemplate="{StaticResource SFTemplateWithContextMenu}" ItemsSource="{Binding Selection.SourceFields, Mode=TwoWay}" AllowDrop="True" >
我下载了 Snoop 以查看内部情况,看看发生了什么。我尝试了几种不同程度的失败方法。
注释掉的部分是我之前试图实现目标的方式。那里的问题是我得到了错误......“找不到与引用'elementname = Field'绑定的源”但是TextBlock使用Snoop显示它的名字是字段。
以我目前的方式,我可以看到文本块有一个本地名称范围,它的名称是 Field - 这是我所期望和想要的。ContextMenu 值表明它有一个带有 2 个项目的 ContextMenu ......这是正确的。因此,我单击 ContextMenu 来查看事物的外观和低端,然后发现 ContextMenu 没有 DataContext。
对此的任何帮助和指导都会非常有用。我不确定我在这里缺少什么。我环顾四周,每当有人似乎接近完成这项工作时,他们都会提到他们找到了一些“解决方法”或其他方法来做到这一点,但永远不会让它发挥作用。这必须有能力工作......我对这个太陌生了,看不到缺失的部分。
我知道可以做一个真正的 MVVM 方式......对吗?