ContextMenu标头绑定

时间:2013-05-24 03:26:43

标签: wpf binding contextmenu

在花了一整天寻找答案之后,我不得不承认失败并寻求帮助。

我需要做的就是将上下文菜单中的Header项绑定到一个propety,但我尝试过的都失败了。

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

返回一个字符串

如下所示

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用于显示 这工作正常。我已经读过,上下文菜单不是主应用程序数据上下文的一部分 这需要在Tag中指定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标头绑定到字符串属性。

报告的错误是

System.Windows.Data错误:40:BindingExpression路径错误:在'对象'''MainWindow'(Name ='This')'上找不到'menuHeader'属性。  BindingExpression:路径= menuHeader; DataItem ='MainWindow'(Name ='This'); target元素是'MenuItem'(Name =''); target属性是'Header'(类型'Object')

有人可以告诉我哪里出错了。

萨拉

1 个答案:

答案 0 :(得分: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}" />

用于绑定