我遇到了绑定到父MainWindow属性MainContentVisibility的问题。我有以下代码:
MainWindow.xaml
<Window x:Class="CallTracker.WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:v="clr-namespace:MyProgram.WPF.Views"
DataContext="{Binding MainPageViewModel, Source={StaticResource Locator}}">
<StackPanel>
<v:CompanyInfoUserControl Width="800" Visibility="{Binding MainContentVisibility, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
<v:MainContentUserControl Width="800" Visibility="{Binding Path=MainContentVisibility, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
</StackPanel>
</Window>
目前我的两个用户控件只不过是一个带有文本块的堆栈面板,直到我弄清楚这个可见性问题。
我可以使用Snoop来检查我的MainPageViewModel,我可以看到属性MainContentVisibilty设置为&#34; Collapsed&#34;但是CompanyInfoUserControl显示了其可见性绑定的问题:
System.Windows.Data错误:40:BindingExpression路径错误: &#39; MainContentVisibility&#39;在&#39; object&#39;上找不到的属性&#39;&#39;主窗口&#39; (名称=&#39;&#39;)&#39 ;. BindingExpression:路径= MainContentVisibility; 的DataItem =&#39;主窗口&#39; (名称=&#39;&#39);目标元素是 &#39; CompanyInfoUserControl&#39; (名称=&#39;&#39);目标财产是“可见性”&#39; (键入&#39;可见性&#39;)
有人可以解释我在这里做错了吗?
修改
我尝试了保罗的建议,现在我将其作为Snoops的绑定错误:
System.Windows.Data错误:40:BindingExpression路径错误: &#39; MainContentVisibility&#39;在&#39; object&#39;上找不到的属性 &#39;&#39; MainPageViewModel&#39; (的HashCode = 63642613)&#39 ;. BindingExpression:路径= MainContentVisibility; 的DataItem =&#39; MainPageViewModel&#39; (的HashCode = 63642613);目标元素是 &#39; CompanyInfoUserControl&#39; (名称=&#39;&#39);目标财产是“可见性”&#39; (键入&#39;可见性&#39;)
解
我实际上并没有绑定到我的数据模型,而是XAML对象(在本例中为MainWindow.xaml)为了绑定数据,我必须添加引用&#39; DataContext&#39;如下:
<v:CompanyInfoUserControl Visibility="{Binding DataContext.MainContentVisibility, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" />
答案 0 :(得分:3)
我认为MainContentVisibility
不在ViewModel上?
如果要在远离viewmodel的主窗口属性上访问它,请提供窗口的名称,例如x:Name="MyMainWindow"
,并在绑定中访问它
Visibility="{Binding MainContentVisibility, ElementName=MyMainWindow}"
答案 1 :(得分:2)
您已将DataContext
的{{1}}设置为Window
。子元素将继承此MainPageViewModel
,因此不需要您的相对路径。您所需要的只是:
DataContext
您当前的代码正在<v:CompanyInfoUserControl Width="800" Visibility="{Binding Path=MainContentVisibility}" />
控件本身上寻找名为MainContentVisibility
的属性,而不是视图模型。