(转载)关于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);
}
}
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);
}
}
相关文章推荐
- 关于ContextMenu绑定问题
- (转载)关于My97 datepicker与Angular ng-model绑定问题解决。
- 关于DataGrid的头模板的绑定问题_AX
- 关于一些论坛转载文章的问题!
- 关于如何在apache上绑定多域名的问题
- 关于ntfs和内核问题(转载)
- 关于数据动态绑定问题的解决方法
- 关于DLL的若干问题 [转载]
- 转载:Java 关于中文乱码问题的解决方案与经验
- 关于WebWork2中的中文问题 选择自 chenyun2000 的 Blog (转载)
- 关于赴东京留学的省钱问题(转载)
- 关于后台生成的模板列的数据绑定问题
- 关于模板控件如何实现多数据源绑定的问题
- 关于控件绑定字段的固定长度显示问题
- 关于C51精确延时问题(转载内容)
- 关于Mysql5出现乱码的问题 (转载)
- 关于项目管理的七十五个问题的答案之MVM版本(转载)
- 关于XP进程问题(转载)
- 关于p4机器上安装oracle8i的问题(转载)
- [转载]关于移动百宝箱应用打包问题的解决办法