关于ContextMenu绑定问题

来源:互联网 发布:笔记本网络插口松动 编辑:程序博客网 时间:2024/05/20 05:28
 <Window.ContextMenu >        <ContextMenu Name="menu">            <MenuItem Header="{Binding Path=Text,ElementName=tbl}"/>        </ContextMenu>    </Window.ContextMenu>    <TextBlock Text="右键菜单" Name="tbl"  />

当使用以上代码的时候,右键窗口弹出的菜单不会显示“右键菜单”,提示“Cannot find source for binding with reference 'ElementName=tbl'”,这是由于ContextMenu不在Window的可视树中,所以找不到TextBlock。

要解决以上问题可以使用代码来进行绑定:

public MainWindow()        {            InitializeComponent();            this.ContextMenu = new ContextMenu();            MenuItem mi = new MenuItem();            mi.SetBinding(MenuItem.HeaderProperty, new Binding("Text") { Source = tbl });            this.ContextMenu.Items.Add(mi);        }

还有一种方式是通过NameScope来解决该问题,通过实现INameScope把所有的控件名称加到同一个xaml NameScope中(Xaml中所有拥有Name或者x:Name的控件都会被添加到controls这个字典里面去),使ContextMenu能找到TextBlock来达到目的,代码如下:

 public partial class MainWindow : Window,INameScope    {        public MainWindow()        {            InitializeComponent();            NameScope.SetNameScope(menu, this);        }                Dictionary<string, object> controls = new Dictionary<string, object>();        object INameScope.FindName(string name)        {                       return controls[name];        }        void INameScope.RegisterName(string name, object scopedElement)        {            controls.Add(name, scopedElement);        }        void INameScope.UnregisterName(string name)        {            controls.Remove(name);        }    }