【问题标题】:WPF + Binding Command and Header of a Context Menu Item using MVVMWPF + 使用 MVVM 的上下文菜单项的绑定命令和标题
【发布时间】:2011-09-13 00:26:00
【问题描述】:

我创建了一个 WPF 应用程序并遵循 MVVM 模式。我的 xaml 中有一个上下文菜单,我需要绑定命令和标题文本。使用下面的代码,我可以将上下文菜单的标题与“MenuItemName”绑定,它是 BOList 中的一个属性,它是一个可观察的集合。我的问题是该命令没有被解雇?我将上下文菜单的项目源更改为 datacontext

(DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}") 

命令工作正常,但我的标题变得空白。有没有办法绑定我的标题和菜单项的命令?这里的命令 MenuClick 是 VM 中的 Icommand 属性,而 MenuItemName 是 BOList 中的属性,它是绑定到我的 ListBox 的可观察集合。

<Grid>
<StackPanel Orientation="Vertical">
   <Button x:Name="btnClickMe" Command="{Binding ButtonCommand}" Content="Click Me" />
  <ListBox ItemsSource="{Binding BOList}" x:Name="lstDemo" SelectedItem="{Binding BussinessObj,Mode=OneWayToSource}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel x:Name="stkStyleRender" Orientation="Horizontal" Background="Cyan" Width="525"  Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" >
          <TextBlock x:Name="txtId" Text="{Binding FirstName}"></TextBlock>
          <TextBlock x:Name="txtName" Text="{Binding LastName}"></TextBlock>
          <StackPanel.ContextMenu>
            <ContextMenu x:Name="cntMnuTest" ItemsSource ="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" >
              <MenuItem Header="{Binding MenuItemName}"  Command="{Binding MenuClick}" CommandParameter="Icon"></MenuItem>
            </ContextMenu> 
          </StackPanel.ContextMenu>

        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
 </ListBox>
</StackPanel> 

【问题讨论】:

  • ViewModel 中的 MenuItemName 是什么样的?在控制台输出中查看是否存在 Beinding Expression 错误,如果看到它,请发布它。

标签: wpf mvvm binding header command


【解决方案1】:

您好,已确定问题。

如果我们将上下文菜单的 Item Source 设置为 BOList(可观察集合)命令不会被触发,因为 ICommand 定义在 Window 数据上下文 (vm) 中。

我们需要明智地处理代码。

由于无法进行绑定调试,所以我在拐弯抹角:-)

这个链接对我帮助很大WPF Tutorial - Debug Databinding Issues in WPF

【讨论】:

    【解决方案2】:

    在上下文菜单中使用 DataContext 而不是使用 Items 源
    然后绑定你的菜单项

    【讨论】:

    • 我试过了,如果设置了datacontext 命令有效但标题属性绑定失败,如果设置了项目源标题绑定有效但命令绑定失败,,,
    • 您好 已确定问题。如果我们将上下文菜单的 Item Source 设置为 BOList(可观察集合)命令将不会被触发,因为 icommand 定义在 Window data ciontext (vm) 中。我们需要明智地处理代码。由于无法进行绑定调试,所以我在拐弯抹角:-) ..这个链接对我帮助很大wpftutorial.net/DebugDataBinding.html
    【解决方案3】:

    试试这个:

    <MenuItem Header="{Binding Path=PlacementTarget.MenuItemName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}"  Command="{Binding Path=PlacementTarget.MenuClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}" />
    

    【讨论】:

    • 如果你设置 DataContext 然后命令绑定发生,如果我们设置项目源头绑定发生.. ???
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2016-06-04
    • 2016-08-21
    • 2018-11-25
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多