将WPF XAML中的DataContext设置为特定对象

时间:2019-01-30 12:36:20

标签: c# wpf xaml

我从控制台应用程序启动了WPF窗口。但是我在数据绑定方面遇到困难。

TL; DR:是否可以在WPF XAML中引用特定的(视图)模型对象?

这是我的代码:

Console.cs 控制台应用程序通过void Main()函数中的静态函数启动视图

static void StartGUI(ViewModelClass viewmodel)
{
    Thread thread = new Thread(() => { new Application().Run(new View.MainWnd(viewmodel)); });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

它获取已在Main()中启动的viewmodel对象。

ViewModel.cs 视图模型是INotifyPropertyChanged接口的通常实现,带有要绑定到视图的属性。

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

using ConsoleStartsGUI.Model;

namespace ConsoleStartsGUI.ViewModel
{
    public class ViewModelClass : INotifyPropertyChanged
    {
        ModelClass model = new ModelClass();

        public string VMProperty
        {
            get { return model.TestProperty; }
            set
            {
                model.TestProperty = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

View.xaml 在视图中,我遇到了问题:该视图应该与控制台应用程序具有相同的视图模型。

当前我使用

<Window.DataContext>
    <ViewModel:ViewModelClass/>
</Window.DataContext>

将viewmodelclass绑定到视图(这是我在VS设计器中单击的结果),因为当我从一开始就使用WPF项目时,通常会起作用。但这会实例化一个新对象,该对象不是控制台应用程序的对象。

View.xaml.cs

using System.Windows;
using ConsoleStartsGUI.ViewModel;

namespace ConsoleStartsGUI.View
{
    public partial class MainWnd : Window
    {
        public MainWnd(ViewModelClass viewmodel)
        {
            InitializeComponent();
        }
    }
}

有没有办法在XAML中引用特定的(视图)模型对象?

最好的问候, 马丁

1 个答案:

答案 0 :(得分:2)

是的,这是可能的:只需从构造函数中分配DataContext

class MainWindow : Window
{
    public MainWindow(ViewModelClass viewmodel)
    {
        InitializeComponent();
        this.DataContext = viewmodel; // should work before as well as after InitalizeComponent();
    }
}

由于某些原因,从XAML绑定显然不起作用。