我通常在代码隐藏中实例化我的ViewModel并将其设置为Window或UserControl的DataContext.
对于这个简单的ViewModel:
public class ViewModel
{
public ObservableCollection<string> items { get; set; }
public ViewModel()
{
items = new ObservableCollection<string>();
items.Add("FirstItem");
items.Add("SecondItem");
items.Add("ThirdItem");
}
}
Run Code Online (Sandbox Code Playgroud)
我正在添加我的本地命名空间,以下语法将设置正确的事情:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)
很好,我知道ViewModel对象被实例化并设置为窗口的DataContext,它按预期工作但有没有办法从代码中访问实例化的对象?
如果我在代码隐藏中创建对象
ViewModel vm = new VewModel();
this.DataContext = vm;
Run Code Online (Sandbox Code Playgroud)
我能够访问vm实例但是使用XAML方法,它是如何实现的?
我创建了这个小例子,以便找出是否有简单的答案.
当您设置DataContext的任何元素,那么所有所述元件的孩子也会有相同的DataContext.
想象一下场景:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)
在这里你给了Window一个DataContext.现在,窗口中的所有子元素实际上都具有相同的元素DataContext.
<TextBox Text="{Binding MyProperty}" />
Run Code Online (Sandbox Code Playgroud)
要掌握DataContext代码隐藏,您可以简单地引用DataContext元素.
ViewModel vm = (ViewModel)this.DataContext;
Run Code Online (Sandbox Code Playgroud)
上面的代码引用DataContext了Window.
如果您需要更具体,并得到DataContext一个的特定元素,那么你可以通过名字引用的元素.
ViewModel vm = (ViewModel)elementName.DataContext;
Run Code Online (Sandbox Code Playgroud)
除此之外,你永远不应该设置DataContext代码隐藏.该MVVM设计模式喜欢把事情分开,如果你开始设置DataContext的UserControl,例如,这种事情会很快搞砸了.
设置DataContextXAML是正确的方法.
| 归档时间: |
|
| 查看次数: |
3661 次 |
| 最近记录: |