我正在使用 MVVM。有一个 XAML 元素具有自己的Name="nameElement"
. 我只能从 MainWindow 类访问它,但我不想在这个类中编写额外的代码。
例如:有一个 ListBox 与Name="kernelList"
看法:
<ListBox x:Name="kernelsList" SelectionChanged="kernelsList_SelectionChanged" Margin="160,0,41,10">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5" Orientation="Horizontal">
<TextBlock Margin="5" FontSize="16" Text="{Binding Name}" HorizontalAlignment="Center" />
<CheckBox Margin="5" FontSize="16" IsChecked="{Binding IsVisualization}" HorizontalAlignment="Center" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我只能访问MainWindow 类中的“kernelList” 。假设我想向列表中添加一个项目
kernelsList.ItemsSource = Kernels;
如何从其他类访问 XAML 元素?
((MainWindow)System.Windows.Application.Current.MainWindow).
+ 所需元素。一般来说,以适合您的方式编写代码。并非所有东西都可以通过绑定来实现,它们并不总是有效。主要是工作代码,不漂亮或不正确。
您目前正遭受许多 MVVM 违规。
根据 MVVM 的规则,你不应该知道你的 View 层有什么,就像 View 层不应该知道任何关于实现的事情一样。通过名称寻址,您违反了此规则,因为您与对象有严格的联系。删除 XAML 并运行项目,如果您正确实现了 MVVM,那么它将运行,代码将工作。
据我了解,您没有设置为的基类,
DataContext
因此您不了解如何进行。创建一个类,例如命名它MainViewModel
并在那里创建另一个 ViewModel 的属性,现在你有一个连接。基于这一切,让我们做一个简单的项目来实现正确的 MVVM 方法:
为方便起见,我们创建了一个目录
ViewModels
,并在其中创建了主类,我们将默认调用它MainViewModel
。将
DataContect
窗口设置为我们创建的类。让我们做对:App.xaml
并删除那里的行StartupUri="MainWindow.xaml"
。接下来,我们通过将其设置为 来
App.xaml.cs
覆盖Startup
我们创建窗口对象的DataContext
。在这个阶段,我们有一个窗口,它有一个
MainViewModel
类形式的数据源,它将很高兴地从中获取所有绑定。让我们在那里创建一个属性并检查一下:让我们用标准文本写入一个
MainViewModel
简单的属性(请记住,绑定仅适用于公共属性!)在窗口的 XAML 中,我们创建一个
TextBlock
,它将从此值中获取文本:结果
如您所见,一切都已成功附加,并且 View 层对 ViewModel 层一无所知。
现在让我们创建另一个 ViewModel,它可以访问主视图,拥有自己的绑定属性,并将更改我们在上面附加的文本的值。
我们开设了一个新班级,我们取任何你喜欢的名字。我会打电话
SecondViewModel
的。请记住,我们为此有一个特殊的文件夹,我们应该在其中创建它吗?C#中传值是DI(有兴趣可以google一下是什么),主要的两种传递方式是通过构造函数或者通过属性。如果一个对象依赖于另一个对象,那么最好通过构造函数传递这种依赖关系。我们的虚拟机将依赖于主虚拟机,所以让我们通过构造函数进行传输:
现在,如果没有 ,就无法创建此类
MainViewModel
,并且通过私有字段(可以将其设为公共属性以进行绑定),我们可以访问所有给定的MainViewModel
对象。现在让我们制作一个锚测试字段并绑定它:
物业本身在
SecondViewModel
:SecondViewModel
在主 VM 中初始化。在类构造函数中初始化的简单公共属性:好吧,在 XAML 中,我们只在需要的地方使用它:
显示来自不同 VM 的属性的结果:
剩下的最后一件事是将主虚拟机从
SecondViewModel
. 在这里,我想你已经猜到了,我们已经有了一个链接,并且可以通过它轻松访问所需的属性,例如,我们通过构造函数来做:最后我们得到改变的值:
这里有一个陷阱 - 如果您的属性在应用程序运行时发生更改,则必须通过 通知
INotifyPropertyChanged
接口,否则接口将具有旧值!在 Form1 中,创建一个新窗口并将指向所需对象的链接传递到其中
在 Form2 中,我们声明一个分配了链接的对象并对其进行更改,从而更改所需的元素
PS,您已经从另一个类访问了 XAML 元素。问候和祝你好运。