在我的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中。
答案 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”资源,这就是您所需要的。