【问题标题】:ContextMenu Header BindingContextMenu 标头绑定
【发布时间】:2013-05-24 03:26:43
【问题描述】:

花了一整天的时间寻找答案后,我不得不认输并寻求帮助。

我需要做的就是将上下文菜单中的 Header 项绑定到一个属性,但是我尝试的所有方法都失败了。

在后面的代码中,我有一个简单的属性,它根据标志返回一个字符串

如下图

namespace myNamespace
{

    public partial class MainWindow : System.Windows.Window
    {

        // Removed Init code for Clarity ......

        public OptMenuText optMenuText = new OptMenuText();

        public class OptMenuText
        {
            public  bool   menuState { get; set; }
            public  string menuHeader
            {
                get { if (menuState)
                         return "String One";
                      else
                         return "String Two";
                     } 
             }
     }

XAMl 代码有一个 ListView 绑定到一个 ObservableCollection 保存数据和各种 DataTemplates 用于显示 这工作正常。我已经读过上下文菜单不是主要应用程序数据上下文的一部分,并且作为 因此它需要在标签中指定 DataContext(希望我有这个权利)

ListView 中有一个上下文菜单,如下所示

<ListView Name="listView1" Margin="6"  SelectionMode="Single"                        
    ItemsSource="{Binding ElementName=This, Path=ConnectCollection}" 
    ItemTemplateSelector="{StaticResource templateSelector}" IsTextSearchEnabled="False" >

    <ListView.ContextMenu>
        <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"  >
            <MenuItem Header="{Binding menuHeader}" />
            <Separator />
            <MenuItem Header="Move Item Up"    Click="MenuItemUp_Click" />
            <MenuItem Header="Move Item Down"  Click="MenuItemDown_Click"/>
         </ContextMenu>
    </ListView.ContextMenu>

 </ListView>

我唯一的问题是我无法将 MenuItem Header 绑定到字符串属性。

报告的错误是

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MainWindow”(名称=“This”)上找不到“menuHeader”属性。 BindingExpression:Path=menuHeader; DataItem='MainWindow' (Name='This');目标元素是'MenuItem'(名称='');目标属性是“标题”(类型“对象”)

谁能告诉我哪里出错了。

莎拉

【问题讨论】:

  • 您的 ContextMenu XAML 没问题。这暗示未设置 ListView 的 DataContext。尝试通过Binding设置ListView的一些属性(比如BorderThickness),看看是否生效。如果没有,那么肯定是 ListView 的 DataContext 没有正确设置。

标签: wpf binding contextmenu


【解决方案1】:

我没有在问题中看到您的嵌套类。问题是嵌套类中有属性,这就是绑定失败的原因。您必须将 optMenuText 公开为属性而不是公共变量。下面的代码将起作用。

 public partial class MainWindow : System.Windows.Window {
     public MainWindow() {
        optMenuText = new OptMenuText();
        InitializeComponent();
     }
     public OptMenuText optMenuText { get; set; }
 }

然后使用

<MenuItem Header="{Binding optMenuText.menuHeader}" />

为您的装订

【讨论】:

  • 非常感谢,但我确信我明白为什么。我想我已经创建了一个包含我使用的属性的类 'OptMenuText' 的实例,但也为这个属性创建了一个如此混乱的属性。请您解释一下这是如何工作的?
  • 它只是简单的类属性访问。即使您将嵌套类放在单独的文件中,它也可以工作。您的 MainWindow 有一个 OptMenuText 类型的对象 optMenuText,我们将其公开为公共属性,以便我们可以在 XAML 中绑定到它。
  • 非常感谢您的帮助和解释,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2011-05-11
相关资源
最近更新 更多