Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过资源设置datacontext_C#_Wpf_Mvvm - Fatal编程技术网

C# 通过资源设置datacontext

C# 通过资源设置datacontext,c#,wpf,mvvm,C#,Wpf,Mvvm,显然,使用“资源”来设置控件的DataContext并不像我所想的那样。我正在努力接近MVVM。下面是设置DataContext的一个实验 主窗口有一个带有两个选项卡的TabControl,每个选项卡显示我宠物的名字,最初是“Sam”。点击标签1上的“更改姓名”按钮,按预期更改宠物的姓名(改为“雏菊”)。在选项卡2上它没有改变 选项卡2的内容是一个页面,具有自己的DataContext SecondTabViewModel。因此,我需要调整TextBlock中的DataContext,以获取My

显然,使用“资源”来设置控件的DataContext并不像我所想的那样。我正在努力接近MVVM。下面是设置DataContext的一个实验

主窗口有一个带有两个选项卡的TabControl,每个选项卡显示我宠物的名字,最初是“Sam”。点击标签1上的“更改姓名”按钮,按预期更改宠物的姓名(改为“雏菊”)。在选项卡2上它没有改变

选项卡2的内容是一个页面,具有自己的DataContext SecondTabViewModel。因此,我需要调整TextBlock中的DataContext,以获取MyPet的名称。这编译正常,并且Intellisense提供了正确的东西,因此不知何故,在控件内进行了设置。但是宠物的名字没有改变

“StaticResource”是否生成实例化MainWindow或其他内容的新副本?有人能帮我吗?我很想知道为什么这不起作用,什么会起作用。这个设置本地DataContext的策略应该是根据at的文档工作的,但我一定是误读了

简而言之,我省略了一些代码(pet类。但是这里的一切似乎都很好,我可以更改pet类实现INotifyPropertyChanged的第一个选项卡上的名称,我正在使用正确的处理程序等等)

main window.xmal


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。最终采取了这种方法。