您的位置:首页 > 其它

(转载)关于ContextMenu绑定问题

2014-08-09 15:05 253 查看
分类: WPF2012-12-28
15:10 453人阅读 评论(2) 收藏 举报

[html] view
plaincopy

<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。

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

[csharp] view
plaincopy

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来达到目的,代码如下:

[csharp] view
plaincopy

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);  

       }  

   }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: