绑定Viewmodel错误| XAML Parse异常

时间:2018-04-13 08:14:34

标签: c# wpf xaml mvvm viewmodel

我使用MVVM模式实现了一个小型WPF应用程序。 我在view.xaml中设置了Datacontext之后。我收到了以下错误。

XAML Parse Exception

XAML的代码

#define NOP() ({;})

我的ViewModel

<control:CustomWindow
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:control="clr-namespace:eCustomWindow;assembly=eCustomWindow"
    xmlns:eControls="clr-namespace:eControls;assembly=eControls"
    xmlns:nGantt="clr-namespace:nGantt;assembly=nGantt"
    xmlns:GanttChart="clr-namespace:nGantt.GanttChart;assembly=nGantt" 
     xmlns:viewModel="clr-namespace:ViewModel;assembly=ViewModel"
    x:Class="iView.Window_Absence"
    Title="Window_Absence" Height="914" Width="1599">


<control:CustomWindow.DataContext>
    <viewModel:ViewModel_Absence/>
</control:CustomWindow.DataContext>

}

Databasecontext类的代码。异常是一样的。在使用adapter_employee填充表employee后,它就抛出了。

  namespace ViewModel

{
    public class ViewModel_Absence : INotifyPropertyChanged 
    {

    private readonly DatabaseContext _DataContext;


    public ViewModel_Absence()
    {
         this._DataContext = DatabaseContext.Instance;      
    }

    #region PropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;


    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion

}

1 个答案:

答案 0 :(得分:1)

IMO你有一个设计问题:你在ViewModel中没有你的DataContext, ViewModel是DataContext 。 MVVM的目的是让View和ViewModel尽可能分离。为了解耦,接口是绝对相关的。

我会做以下事情。作为ViewModel:

public interface IMainViewModel : IViewModel {}
public interface IViewModel {}
public class MainViewModel : IMainViewModel, INotifyPropertyChanged {}

在View的CodeBehind(MainWindow.xaml.cs)中:

public interface IView {}
public partial class MainWindow : IView
{
    public IMainViewModel ViewModel
    {
        get { return (IMainViewModel)DataContext; }
        set { DataContext = value; }
    }

    public MainWindow() // for design
    {
        InitializeComponent();
        ViewModel = new MainViewModel();
    }

    public MainWindow(IMainViewModel mainViewModel) // for DI
    {
        InitializeComponent();
        ViewModel = mainViewModel;
    }
}

并在View(MainWindow.xaml)中,确保在Window(或任何View类型)标记中有:

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:myns="clr-namespace:YOURNAMESPACE"
    d:DataContext="{d:DesignInstance myns:MainViewModel, IsDesignTimeCreatable=True}"

因此,当您处理设计时,您的ViewModel实例可用于您的设计,并且您在运行时也会拥有正确的ViewModel。因此,您可以调整ViewModel的属性以进行设计(例如,使用模拟),并为运行时提供其他值(可能与数据库或任何内容的连接)。