gpt4 book ai didi

wpf - 具有多个 View 的单个 View 模型实例

转载 作者:行者123 更新时间:2023-12-02 04:59:28 25 4
gpt4 key购买 nike

在我的 WPF 应用程序中,我有两个 View 来表示一个 View 模型。两个 DataContexts 都是用 View 模型的单个实例设置的。但是,属性更改通知没有发生, View 和 View 模型之间的连接丢失。这个想法是,如果用户在一个 View 中更改数据,应该立即反射(reflect)在另一个 View 中的更改。如何将单个 View 模型实例附加到多个 View ?

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

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

最佳答案

您可能需要将绑定(bind)模式设置为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 的窗口(省略 header ):

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

关于wpf - 具有多个 View 的单个 View 模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com