具有多个视图的单个viewmodel实例

时间:2013-08-10 00:39:47

标签: wpf

在我的WPF应用程序中,我有两个视图来表示单个视图模型。 DataContexts都使用viewmodel的单个实例进行设置。但是,属性更改通知未发生,并且视图和视图模型之间的连接丢失。这个想法是,如果用户在一个视图中更改数据,则应立即反映其他视图中的更改。如何附加具有多个视图的单个viewmodel实例?

public MainWindow() { 
    InitializeComponent(); 
    MembersViewModel userView = new MembersViewModel(); 
    MemberView.DataContext = userView; 
    MemberPreview.DataContext = userView; 
} 

我有两个视图MemberView和MemberPreview,两者都使用MembersViewModel。 MemberView是详细视图,MemberPreview是一种子集。当我在MemberView中更改某些内容(例如:MemberName)时,我希望更改反映在MemberPreview中。

1 个答案:

答案 0 :(得分:0)

您可能需要将绑定模式设置为TwoWay,例如:

{Binding myData, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}

我发现明确设置模式可以更好地保证数据到达ViewModel。以下简单示例有效。

考虑这个ViewModel类:

Imports System.ComponentModel

Public Class VM
    Implements INotifyPropertyChanged

    Private _myData As String
    Public Property myData As String
        Get
            Return _myData
        End Get
        Set(ByVal value As String)
            _myData = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("myData"))
        End Set
    End Property

    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

    Public Sub New()
        myData = "StartingData"
    End Sub
End Class

然后,包含此XAML的窗口(省略标题):

<Window.Resources>
    <local:VM x:Key="ViewModel"/>
</Window.Resources>
<Grid DataContext="{StaticResource ViewModel}">
    <StackPanel>
        <TextBlock Text="{Binding myData}" />
        <TextBox  Text="{Binding myData, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}"/>
        <Button Click="Button_Click">Second Window</Button>
    </StackPanel>
</Grid>

这段代码:

Class MainWindow 
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim n = New SecondWindow
        n.DataContext = Me.FindResource("ViewModel")
        n.Show()
    End Sub
End Class

使用此内容定义SecondWindow类:

<Grid>
    <TextBlock Text="{Binding myData}"/>
</Grid>

按钮实例化SecondWindow,将DataContext设置为MainWindow的“ViewModel”资源,这就是您所需要的。