所以,我已经创建了自己的UserControl子类,名为ChildView(我真的想不出一个像样的名字),我想在窗口中的容器内显示,我有很多不同种类的这些UserControls窗户必须能够显示所有这些。 UserControls实现了我的子类:
<src:ChildView x:Class="(namespace).LoginView" [...]>
public partial class LoginView : ChildView
我试图将它添加到我的窗口,如下:
<Grid x:Name="ViewHolder" Grid.Column="1" Grid.Row="1">
<src:ChildView DataContext="{Binding CurrentView}" />
</Grid>
private ChildView _currentView;
public ChildView CurrentView
{
get { return _currentView; }
set
{
if (_currentView == value)
return;
_currentView = value;
smLog.Trace("View set to {0}", value.GetType().Name);
NotifyPropertyChanged("CurrentView");
}
}
然而,这不起作用。设置CurrentView时,我的容器中没有显示任何内容。输出中没有错误消息表明绑定有问题。窗口中的其他数据绑定有效。我可以通过直接在XAML中指定它们的类来使用我的ChildView,即:
<Grid x:Name="ViewHolder" Grid.Column="1" Grid.Row="1">
<src:LoginView />
</Grid>
我已经阅读了一些有关依赖属性的内容,但我认为我不需要这些属性?我确实试图实现一个,但它似乎没有帮助,虽然我可能犯了一些错误,我无法完全绕过它......
所以我想我的问题是;我需要依赖属性吗?如果是这样,我在这种情况下如何实现它?如果没有,问题是什么?
答案 0 :(得分:1)
更改Child的DataContext无关紧要,您尝试更改控件本身,而不是更改它绑定的数据。您需要做的是添加一个包含实际视图的占位符控件。 WPF内置了这样的东西,看看ContentControl。
更改您的网格,使其包含ContentControl而不是ChildView,并将视图绑定到控件的Content属性
<Grid>
<ContentControl Content="{Binding CurrentView}"/>
</Grid>