c# - 同一 View WPF MVVM 中多个 ViewModel 的绑定(bind)

标签 c# wpf mvvm data-binding datacontext

我有一个 WPF MVVM 项目,其中包含一个包含多个控件的 View

有一个DockPanel,其中包含View中的所有控件以及DataContext到MainViewModel类,并且在它的内部有一个Grid 与 DataContext 到其他对象 ViewModel,它的属性包含在 MainViewModel 类中。

现在,在那个网格中,我有一个2个按钮,周围有WrapPanel,并且这些按钮有一个对写入 MainViewModel 类中的属性的命令,当我按下它时没有任何反应(因为 Grid 的 DataContext 是其他对象)。

我需要将命令保留在 MainViewModel 类中,我该怎么做?

XAML:(仅相关部分)

<DockPanel x:Name="MonitorParent" DataContext="{Binding MonitorMainViewModel}" LastChildFill="False" Width="1144" HorizontalAlignment="Left">
      .......     
    <StackPanel>
        <ContentControl Visibility="{Binding Path=NoMonitorsMessageVisibility, Converter={StaticResource visibilityConverter}}">
            <StackPanel Width="804" Height="574">
                <Grid DataContext="{Binding CurrentMonitor}" Margin="10 0" Height="auto">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" MinHeight="23" />
                        <RowDefinition Height="Auto" MinHeight="23" />
                        <RowDefinition Height="Auto" MinHeight="23" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="140" />
                    </Grid.ColumnDefinitions>
                    <Label Grid.Column="0" Grid.Row="15"  Content="Serial Number" x:Name="SerialNumber"   />
                    <WrapPanel  DataContext="{Binding MonitorMainViewModel}" HorizontalAlignment="Center" Margin="0,10,0,10" Grid.ColumnSpan="2" Grid.Row="6" >
                        <Button Content="Add" Width="60" Margin="0,0,40,0" Command="{Binding AddConfidenceCommand}" />
                        <Button Content="Delete" Width="60" Margin="30,0,0,0" Command="{Binding DeleteConfidenceCommand}"/>
                    </WrapPanel>

                     ........
  </DockPanel

最佳答案

您可以使用 DockPanel 的名称进行绑定(bind),如下所示:

<DockPanel x:Name="MonitorParent" DataContext="{Binding MonitorMainViewModel}" LastChildFill="False" Width="1144" HorizontalAlignment="Left">
  .......     
<StackPanel>
    <ContentControl Visibility="{Binding Path=NoMonitorsMessageVisibility, Converter={StaticResource visibilityConverter}}">
        <StackPanel Width="804" Height="574">
            <Grid DataContext="{Binding CurrentMonitor}" Margin="10 0" Height="auto">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" MinHeight="23" />
                    <RowDefinition Height="Auto" MinHeight="23" />
                    <RowDefinition Height="Auto" MinHeight="23" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="140" />
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Grid.Row="15"  Content="Serial Number" x:Name="SerialNumber"   />
                <WrapPanel  DataContext="{Binding MonitorMainViewModel}" HorizontalAlignment="Center" Margin="0,10,0,10" Grid.ColumnSpan="2" Grid.Row="6" >
                    <Button Content="Add" Width="60" Margin="0,0,40,0" Command="{Binding ElementName=MonitorParent, Path=DataContext.AddConfidenceCommand}" />
                    <Button Content="Delete" Width="60" Margin="30,0,0,0" Command="{Binding ElementName=MonitorParent, Path=DataContext.DeleteConfidenceCommand}"/>
                </WrapPanel>

                 ........

关于c# - 同一 View WPF MVVM 中多个 ViewModel 的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44408487/

相关文章:

c# - 突出显示列表框中的多个项目

wpf 字典绑定(bind),其中 key=variable

c# - 如何在 ViewModel 中获取控件的高度

c# - 当只有显式更改的行应该被更改时,datagrid 中的多行正在更改

c# - 如何通过 Windsor 的接口(interface)和命名空间注册类?

c# - 将 C++/CLI 翻译成 C#

c# - 如何以编程方式在 C# 中触发鼠标左键单击?

c# - 自动映射类型为接口(interface)的属性

c# - 过滤 ObservableCollection 以仅显示某些项目

c# - TreeView 的 PropertyChanged 始终为 null