C# 通过资源设置datacontext
显然,使用“资源”来设置控件的DataContext并不像我所想的那样。我正在努力接近MVVM。下面是设置DataContext的一个实验 主窗口有一个带有两个选项卡的TabControl,每个选项卡显示我宠物的名字,最初是“Sam”。点击标签1上的“更改姓名”按钮,按预期更改宠物的姓名(改为“雏菊”)。在选项卡2上它没有改变 选项卡2的内容是一个页面,具有自己的DataContext SecondTabViewModel。因此,我需要调整TextBlock中的DataContext,以获取MyPet的名称。这编译正常,并且Intellisense提供了正确的东西,因此不知何故,在控件内进行了设置。但是宠物的名字没有改变 “StaticResource”是否生成实例化MainWindow或其他内容的新副本?有人能帮我吗?我很想知道为什么这不起作用,什么会起作用。这个设置本地DataContext的策略应该是根据at的文档工作的,但我一定是误读了 简而言之,我省略了一些代码(pet类。但是这里的一切似乎都很好,我可以更改pet类实现INotifyPropertyChanged的第一个选项卡上的名称,我正在使用正确的处理程序等等) main window.xmalC# 通过资源设置datacontext,c#,wpf,mvvm,C#,Wpf,Mvvm,显然,使用“资源”来设置控件的DataContext并不像我所想的那样。我正在努力接近MVVM。下面是设置DataContext的一个实验 主窗口有一个带有两个选项卡的TabControl,每个选项卡显示我宠物的名字,最初是“Sam”。点击标签1上的“更改姓名”按钮,按预期更改宠物的姓名(改为“雏菊”)。在选项卡2上它没有改变 选项卡2的内容是一个页面,具有自己的DataContext SecondTabViewModel。因此,我需要调整TextBlock中的DataContext,以获取My
MainWindowViewModel
公共类MainWindowViewModel
{
公共宠物MyPet{get;set;}
公共ICommand ChangePetNameCommand{get;set;}
公共主窗口视图模型()
{
MyPet=新宠物();
ChangePetNameCommand=
新的RelayCommand(ChangePetName,(objecto)=>true);
}
公共void ChangePetName(对象o)
{
MyPet.Name=“Daisy”;
}
}
SecondTab.xmal
第二个选项卡视图模型
名称空间WpfApp9
{
公共类SecondTabViewModel
{
public SecondTabViewModel()
{
}
}
}
这些行
<Page.Resources>
<local:MainWindowViewModel x:Key="M"/>
</Page.Resources>
在SecondTab.xaml中,正在创建第二个MainWindowViewModel实例
换句话说,SecondTab不在原始MainWindowViewModel上运行
您必须以某种方式将对原始MainWindowViewModel实例的引用传递给SecondTabViewModel
SecondTab可能不是使用框架和页面,而是简单地从其父元素继承DataContext的UserControl,您可以传递一个视图模型对象,如
<TabItem Header="Second Tab" Height="50">
<local:SecondTab DataContext="{Binding SecondTabVM}"/>
</TabItem>
其中,
SecondTabVM
是MainWindowViewModel的一个属性,它包含SecondTabViewModel实例。thx。最终采取了这种方法。