我目前正在使用以下代码加载并最终在磁盘上显示xaml文件:
StreamReader mysr = new StreamReader(absFile);
Window window = XamlReader.Load(mysr.BaseStream) as Window;
window.DataContext = SomeViewModel;
然后我可以通过访问视图模型上的属性来对文本和其他元素进行绑定,如下所示:
<Label Content="{Binding Path=SomeStringProperty}" ... />
我甚至可以设置转换器,例如加载图像或将布尔值更改为可见性值。我无法工作的是一个绑定,它会导致按钮单击或菜单项选择来调用视图模型中的代码(或者我的应用程序中的任何其他类)。我喜欢MenuItem看起来像这样:
<MenuItem Command="{Binding Path=ClickCommand}" CommandParameter="Some Parameter" Header="Some Menu Item" />
这个menuItem会调用&#34; ClickCommand&#34;在我的代码中被选中。假设这是通过一些ICommand实现完成的,我也希望能够实现&#34; CanExecute&#34;功能也是如此,但如果需要的话,我会在没有它的情况下生活。
我已经搜索了几个小时,尝试了所有可以想象到的东西并且无法正常工作。我要么得到令人难以置信的模糊异常,要么完全沉默失败(意味着当我点击菜单项时没有任何反应)。有人可以提供一个包含xaml代码和支持C#类的示例吗?
现在我唯一能想到的就是使用VisualTreeHelper或其他类似的方法遍历窗口元素,并根据某些Name属性约定手动添加命令绑定。我知道这可以在我做快速原型时工作,但必须有更好的方法。
由于 戴夫
答案 0 :(得分:1)
设置PresentationTraceSources.TraceLevel=High
是关键......我之前尝试了大约100件事,但没有任何结果。但是,在TraceLevel设置的情况下,我回到了这篇帖子的建议:
How to bind WPF button to a command in ViewModelBase?
使用TraceLevel设置我可以清楚地看到工作正常,除了我在磁盘上使用较旧的xaml文件作为测试。它是手动设置MenuItem的DataContext,从而覆盖包含我试图调用的命令的那个。