【问题标题】:How to re-wire View data context to XAML from C#?如何将视图数据上下文从 C# 重新连接到 XAML?
【发布时间】:2016-02-15 16:47:44
【问题描述】:

我已经在 View 的代码中将我的 View 的数据上下文设置为它关联的 ViewModel。但在阅读a question on the MVVM pattern, 后,建议将此粘合代码移动到视图的 XAML 标记上。

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

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

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

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

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

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

        }

    }

【问题讨论】:

    标签: c# xaml mvvm data-binding datacontext


    【解决方案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

    【讨论】:

    • 好的建议,将使用创建第二个无参数 ctor 的方法,它调用现有的。我知道如何设置一个无参数的 ctor,但是如何定义从其中对我的第二个 ctor 的调用?我看到了使用 base() 的建议,但不确定如何实现。我的虚拟机设置如下供参考:github.com/BrianJVarley/MongoDB_App/blob/master/MongoDBApp/…
    • 您可以像这样从新构造函数调用现有构造函数:public MainViewModel() : this(new CustomerRepository())。但是在第二次考虑之后,我认为最好在新的无参数构造函数中创建存储库而不调用现有的构造函数。因为那时您可以检查您是否处于设计阶段。查看我编辑的回复。
    • 酷,你遇到过使用这个msdn.microsoft.com/en-us/library/… 吗?作为拥有重载 ctor 的解决方案?我尝试使用您的上述建议,但我无法“新建”我的 Repo 实例,因为它是静态单例。
    • 我还没有使用 ObjectDataProvider。但我认为创建存储库不是 ObjectDataProvider 的典型使用场景,因为在设计时创建像存储库(执行数据库访问)这样的类是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多