Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t将用户控件(视图)分配给我的ContentControl,始终为空_C#_Wpf - Fatal编程技术网

C# Can';t将用户控件(视图)分配给我的ContentControl,始终为空

C# Can';t将用户控件(视图)分配给我的ContentControl,始终为空,c#,wpf,C#,Wpf,我有一个WPF应用程序,我试图在主窗口中显示一个动态用户控件。为此,我有一个ContentControl,并将其绑定到一个名为MyFooView的属性,该属性的类型为FooView 当调用主窗口的构造函数时,我将FooView分配给我的UserControl,如下所示: //using statements above... //public class MainWindowViewModel, implements INotifyPropertyChanged public FooView

我有一个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是什么,它总是空的。因此,我希望看到我的视图的空间是空的。谁能帮我理解我做错了什么?非常感谢

它总是空的,因为在setter中有空检查。如果字段为null,但字段以null开头,则不能为属性赋值

更改为:

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

或者,您可以对
值执行空检查,这可能是您打算首先执行的操作,例如:

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

视图模型中不应包含视图。这不是MVVM。使用带有FooView的DataTemplate来显示foo数据。@克莱门斯,你能给我举一个例子说明哪些数据需要参数吗?不确定“哪些数据需要参数”是什么意思。您可以从这里开始阅读:。我的意思是,如何为其构造函数接受参数的视图创建datatameplate?将视图更改为不接受构造函数参数。用属性替换这些属性,最好是可以绑定到视图模型属性的依赖属性。顺便说一下,上面所说的是完全正确的。尽管这可以解决您的问题,但如果您试图使用MVVM模式,这是一个糟糕的设计。哇,这是一个重大的缺陷。谢谢你接电话。我将接受@Clemens的建议,并将其设置为我将MyFooView设置为DataTemplate的位置。没问题,欢迎来到逻辑错误的奇妙世界,在那里代码总是编译的,但不知何故从未按预期的方式工作。这类事情很容易错过,所以不要太难过。
public FooView MyFooView
{
    get
    {
        return _myfooView;
    }
    set
    {
        if (value!= null)
        {
            _myfooView= value;
            RaisePropertyChanged(nameof(MyFooView));
        }
    }
}