如何使用StaticResource在XAML中定义DataContext

我想通过XAML中的静态资源声明一个DataContext,作为Northwind数据库中Customers的绑定。 我可以在代码(C#)中轻松完成此操作,但想学习如何在XAML中完成。 我已经尝试了所有可以找到的例子,但它们都不适合我。 我认为问题出在我标记为[Option1]和[Option2]的两行XAML代码行中。 你能澄清一下这个语法究竟应该是什么吗?

C#

namespace DataGridEF { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); bModel1 bNorthWind = new bModel1(); //this.DataContext = bNorthWind; bNorthWind.GetCustomers(); } } } namespace DataGridEF { public class bModel1 { List _Customers; public List Customers { get { return _Customers; } set { _Customers = value; } } public void GetCustomers() { NorthwindEntities NorthWind = new NorthwindEntities(); var CustomerQ = from cust in NorthWind.Customers select cust; _Customers = CustomerQ.ToList(); } } } 

XAML

                

如果为了避免使问题与Entities Framework和MSSQL NorthWind数据库复杂化,那么在Exampleproject“ WPF / MVVM快速入门教程 ”的示例2示例代码中提供了很好的说明。

对于您的XAML,您应该将其开头更改为:

         

这种方法的另一种变体可以在“在代码中设置DataContext而不是XAML的优势是什么?”中看到。 , 那个部分:

     

DataContext定义从代码隐藏迁移到XAML与StaticResourceDynamicResource的使用无关。 请参阅: WPF中StaticResource和DynamicResource之间的区别是什么? 可能在codeproject WPF中更好地解决:StaticResource与DynamicResource

相关,有用和进一步阅读:

  • 如何摆脱DataContext InitializeComponent中的StackOverflowexception?
  • 为什么在XAML中绑定MainWindow datacontext的行为与使用this.datacontext = this的代码隐藏中的绑定相同?

我更喜欢将键设置为静态字符串 – 如果您可以轻松避免,WPF具有足够的魔术字符串而无需将自己转移到重构角落。

App.xaml

 xmlns:viewModels="clr-namespace:MyAppNamespace.ViewModels" xmlns:local="clr-namespace:tvCADdesktop" x:Name="App" ...  

App.xaml.cs

 public static readonly string MainVmResourceKey = "MainVm"; 

在我的各种Control.xaml

        

请注意UserControl部分是您要将ViewModel应用于的任何类型。