如何从C#重新查看数据上下文到XAML?

时间:2015-11-14 00:59:22

标签: c# xaml mvvm data-binding datacontext

我已将View的数据上下文设置为后面的View代码中与之关联的ViewModel。但在阅读a question on the MVVM pattern,后,建议将此胶水代码移至View的XAML标记处。

谷歌搜索向我展示了在XAML中设置上下文的示例,by setting a namespace to the VM and setting data context.

虽然在我的情况下,MainViewModel采用CustomerRepository实例的参数,我不确定如何在XAML中设置,基于前面的示例。

有谁知道如何将数据上下文移动到View的XAML?

这就是我目前在C#中设置View代码的方式:

    public partial class MainView : Window
    {
        private MainViewModel ViewModel { get; set; }

        public MainView()
        {
            InitializeComponent();
            ViewModel = new MainViewModel(CustomerRepository.Instance);
            this.DataContext = ViewModel;

        }

    }

1 个答案:

答案 0 :(得分:1)

您可以在xaml中实例化您的视图模型,如下所示:

<Window x:Class="MyWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Test" 
            xmlns:viewModel="clr-namespace:ViewModels"> 
        <Window.DataContext>
            <viewModel:ExampleViewModel/>
        </Window.DataContext>
</Window>


您解释过您的视图模型构造函数具有存储库的参数。你需要这个构造函数用于单元测试吗?

通常,您可以在视图模型的无参数构造函数中新建存储库实例。

public class MainViewModel : ObservableObject, INotifyPropertyChanged
{

    private static CustomerRepository _customerRepository;

    // existing constructor
    public MainViewModel(CustomerRepository customerRepository)
    {
        _customerRepository = customerRepository;
    }

    // new parameterless constructor
    public MainViewModel(CustomerRepository customerRepository)
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            _customerRepository = new CustomerRepository();         
        }
    }
}


检查是否处于设计模式

在xaml中创建视图模型时还需要考虑一件事:在打开视图时,在设计时调用视图模型构造函数。 所以你需要在构造函数中包含任何代码,这些代码在设计时没有任何意义,只能在“仅在非设计时”条件下。 如果您不这样做,您的视图将在设计器中显示错误。

在此回复中对此进行了解释:Check if in design mode