C# 从父视图xaml设置子控件viewmodel的属性

C# 从父视图xaml设置子控件viewmodel的属性,c#,wpf,mvvm,C#,Wpf,Mvvm,我想从父视图xaml为子控件设置视图模型的属性 所以我希望父xaml是这样的: <UserControl x:Class="MainUserControl" ...> <Grid...> <local:ChildDetailView x:Name="childView1" ChildVMProperty="ValueOptions.Option1"/> <local:ChildDetailView x:Name="childView2"

我想从父视图xaml为子控件设置视图模型的属性

所以我希望父xaml是这样的:

<UserControl x:Class="MainUserControl"
...>
<Grid...>
    <local:ChildDetailView x:Name="childView1" ChildVMProperty="ValueOptions.Option1"/>
    <local:ChildDetailView x:Name="childView2" ChildVMProperty="ValueOptions.Option2"/>
</Grid>
</UserControl>
如果ChildVMProperty是ChildDetailViewModel上的一个属性(如果相关),则该属性将采用ValueOptions类型的枚举

请注意,ViewModels是在代码隐藏中设置的,而不是在xaml中设置的,因为实际上我在ViewModels中使用DI来注入prism事件聚合器


当我尝试这样做时,xaml会抱怨,因为它显然对ChildViewModel类一无所知。要做到这一点,正确的语法是什么?或者,如果不是那么直截了当的话,我需要什么选项来解决这个问题?

您需要首先创建ChildDetailView.xaml文件。假设您将此文件放在名称空间MyApp.Controls中,那么上面的XAML将类似于

<UserControl x:Class="MainUserControl"
             xmlns:local="clr-namespace:MyApp.Controls" >
    <Grid ...>
        <local:ChildDetailView x:Name="childView1" ChildVMProperty="ValueOptions.Option1"/>
        <local:ChildDetailView x:Name="childView2" ChildVMProperty="ValueOptions.Option2"/>
    </Grid>
</UserControl>
您还必须确保在UserControl上定义了DependencyProperty DP ChildVMProperty-但这是另一个问题,关于这个特定主题有很多答案。若要为视图添加DP,您可能需要对您试图针对的特定控件进行子类化

对属性使用DPs的另一种替代方法是使用转换器


我希望这有帮助。

谢谢。如果我将DP添加到子视图中,子视图模型如何知道该值是什么?子ViewModel需要通过绑定到DP来处理该值。ChildVMProperty={Binding PropertyInTheViewModel}。如果绑定该属性,则无法在xaml中实际设置该值。我曾研究过OneWayToSource绑定,但无法确定如何指定TargetNullValue值不起作用。