【问题标题】:Can't assign user Control (view) to my ContentControl, is always null无法将用户控件(视图)分配给我的 ContentControl,始终为空
【发布时间】:2020-01-15 20:28:21
【问题描述】:

我有一个 WPF 应用程序,我试图在我的主窗口中显示一个动态用户控件。为此,我有一个 ContentControl,并将它绑定到一个名为 MyFooView 的属性,该属性的类型为 FooView

当我的主窗口的构造函数被调用时,我将 FooView 分配给我的 UserControl:

//using statements above...
//public class MainWindowViewModel, implements INotifyPropertyChanged

public FooView MyFooView
{
    get
    {
        return _myfooView;
    }
    set
    {
        if (_myfooView!= null)
        {
            _myfooView= value;
            RaisePropertyChanged(nameof(MyFooView));
        }
    }
}
private FooView _myfooView;

public MainWindowViewModel()
{
   MyFooView = new FooView(...); //takes in parameters
   //at this point MyFooView is (null)
}

我的 Xaml:

   <Grid Grid.Row="1" Margin="30,0" Width="880">
        <ContentControl Content="{Binding MyFooView}"/>
        <Rectangle Stroke="Black" StrokeThickness="2"/>
    </Grid>

无论 MyFooView 总是为空。因此,我期望看到我的视图的空间是空的。谁能帮我理解我做错了什么?非常感谢!

【问题讨论】:

  • 视图模型中不应有视图。那不是 MVVM。使用带有 FooView 的 DataTemplate 来显示 foo 数据。
  • @Clemens 你能给我看一个带参数的例子吗?
  • 不确定 "of which requires parameters" 应该是什么意思。您可以从这里开始阅读:Data Templating Overview.
  • 我的意思是,如何创建其构造函数采用参数的视图的数据模板?
  • 将视图更改为采用构造函数参数。用属性替换它们,最好是可以绑定到视图模型属性的依赖属性。

标签: c# wpf


【解决方案1】:

它始终为 null,因为您在 setter 中有一个 null 检查。当字段为空时,您不能为属性分配值,但字段开始时为空。

更改自:

public FooView MyFooView
{
    get
    {
        return _myfooView;
    }
    set
    {
        if (_myfooView!= null)
        {
            _myfooView= value;
            RaisePropertyChanged(nameof(MyFooView));
        }
    }
}

到:

public FooView MyFooView
{
    get
    {
        return _myfooView;
    }
    set
    {
        _myfooView= value;
        RaisePropertyChanged(nameof(MyFooView));
    }
}

或者,您可以对value 执行空检查,这可能是您一开始就打算做的事情,如下所示:

public FooView MyFooView
{
    get
    {
        return _myfooView;
    }
    set
    {
        if (value!= null)
        {
            _myfooView= value;
            RaisePropertyChanged(nameof(MyFooView));
        }
    }
}

【讨论】:

  • 顺便说一句,Clemens 说的完全正确。即使这应该可以解决您的问题,但如果您尝试使用 MVVM 模式,这是一个糟糕的设计。
  • 哇,这是一个重大的轻微。谢谢你抓住那个。我将接受@Clemens 的建议并在我将 MyFooView 设置为 DataTemplate 的位置进行设置
  • 没问题,欢迎来到充满逻辑错误的奇妙世界,代码总是可以编译,但不知何故永远不会按照预期的方式工作。这种事情很容易错过,所以不要难过。
猜你喜欢
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多