【问题标题】:Data binding to custom UserControl数据绑定到自定义 UserControl
【发布时间】:2013-08-20 09:14:59
【问题描述】:

所以,我创建了自己的 UserControl 子类,称为 ChildView(我真的想不出一个像样的名字),我想在窗口的容器中显示它,我有许多不同类型的 UserControl并且窗口必须能够显示所有这些。 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 中指定它们的类来使用我的 ChildViews,即:

<Grid x:Name="ViewHolder" Grid.Column="1" Grid.Row="1">
        <src:LoginView />
</Grid>

我已经阅读了一些关于依赖属性的内容,但我认为这里不需要?我确实尝试过实现一个,但它似乎没有帮助,虽然我可能犯了一些错误,但我无法完全理解它......

所以我想我的问题是;我需要依赖属性吗?如果是这样,在这种情况下我该如何实施?如果不是,是什么问题?

【问题讨论】:

  • 试试snoop。它是 wpf 实用程序,非常有用,可以检查您的控件是否存在于网格中,以及您在这里遇到的具体问题
  • 根据 Snoop,我的 ViewHolder 包含“[007] ChildView 2”,如果我检查其属性,DataContext 会以绿色突出显示并显示“[(namespace).LoginView] {Path=CurrentView}” . IsInitialized、IsLoaded、IsVisible、IsEnabled 都是 true...Height 和 Width 有合理的值。

标签: c# wpf data-binding dynamic-usercontrols


【解决方案1】:

更改 Child 的 DataContext 无关紧要,您正在尝试更改控件本身,而不是它绑定的数据。您需要做的是添加一个包含实际视图的占位符控件。 WPF内置了这样的东西,看看ContentControl

更改您的网格,使其包含 ContentControl 而不是 ChildView,并将视图绑定到控件的 Content 属性

<Grid>
  <ContentControl Content="{Binding CurrentView}"/>
</Grid>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2012-07-10
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多