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