wpf 视图模型如何知道哪个视图示例改变了?

shyt4zoc  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(149)

我想多次示例化一个UserControl。我尝试使用MVVM方法。例如,在MainWindow.xaml中

<StackPanel Orientation="Vertical">
        <GroupBox x:Name="Default Transition" Header="Global Transitions" MaxWidth="500">
            <uc:TransitionsForm x:Name="GlobalTrans"/>
        </GroupBox>
        <GroupBox x:Name="Slide Transition" Header="Slide Transitions" MaxWidth="500">
            <uc:TransitionsForm x:Name="SlideTrans"/>
        </GroupBox>
    </StackPanel>

第一个示例是未定义幻灯片切换时使用的默认切换。
我的视图模型叫做TransitionViewModel,我把视图模型连接到xaml中的UserControl,如下所示

<UserControl.Resources>
    <Style x:Key="cbTransStyle" TargetType="ComboBox">
        <Setter Property="Margin" Value="14,5,5,5"/>
        <Setter Property="Height" Value="30"/>
        <Setter Property="SelectedIndex" Value="0"/>
        <Setter Property="SelectedValuePath" Value="Content"/>
    </Style>
    <tranconv:KeyValConverter x:Key="KeyValConvert"/>
    <vm:TransitionViewModel x:Key="TransVM"/>
</UserControl.Resources>

然后在UserControl的网格中设置DataContext。

<Grid DataContext="{StaticResource TransVM}">

我的问题是视图模型如何知道哪个视图示例发生了变化?我可以在MainWindow中添加一个事件处理程序,但这听起来不像MVVM方法。如果我可以访问视图名称,这也会起作用。

0yg35tkg

0yg35tkg1#

正如评论中指出的,你应该在主视图模型中示例化子视图模型,并绑定到它们。

public class MainViewModel
{
    public TransitionViewModel GlobalTrans { get; set; } = new TransitionViewModel();
    public TransitionViewModel SlideTrans { get; set; } = new TransitionViewModel();
}

<Window x:Class="...">
    <Window.DataContext>
       <vm:MainViewModel/>
    </Window.DataContext>
    <StackPanel Orientation="Vertical">
            <GroupBox x:Name="Default Transition" Header="Global Transitions" MaxWidth="500">
            <uc:TransitionsForm x:Name="GlobalTrans" DataContext="{Binding GlobalTrans}"/>
        </GroupBox>
            <GroupBox x:Name="Slide Transition" Header="Slide Transitions" MaxWidth="500">
            <uc:TransitionsForm x:Name="SlideTrans" DataContext="{Binding SlideTrans}"/>
        </GroupBox>
    </StackPanel>
</Window>

不要忘记删除UserControl中的DataContext设置,它大多必须来自外部。

相关问题