如何让我的 ViewModel 实例化
How to get my ViewModel instantiated
我有一个可以运行的应用程序,现在我正在尝试使用适当的 MVVM 来实现它。正如我从几个月的阅读中了解到的那样,LinqToSQL classes(VS2013)是我的模型,它使用的 SQL 服务器数据库也是如此。 UI 是视图,我正在实现一些 ObservableCollections 作为我的视图模型。所以这是 ViewModel:
partial class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
static DataClasses1DataContext _dataDc = new DataClasses1DataContext();
ObservableDocuments _oDoc = new ObservableDocuments(_dataDc);
public ObservableCollection<Document> oDoc
{
get
{
return _oDoc;
}
}
public ICommand LoadData
{
get;
private set;
}
protected void RaisePropertyChangedEvent(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
在工作版本中,DataContext 和 ObservableDocuments 行位于 MainWindow 代码中。 . .所以我已经移动了它们。这是 xaml:
<Window x:Class="LINQ_MVVM_1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModel="clr-namespace:LINQ_MVVM_1.ViewModel"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"
DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
ItemsSource="{Binding oDoc.View}">
<DataGrid.Columns>
<DataGridTextColumn x:Name="docIDColumn" Binding="{Binding DocId}" Header="ID" Width="65"/>
<DataGridTextColumn x:Name="DocumentNumberColumn" Binding="{Binding Number}" Header="Document Number" Width="*"/>
<DataGridTextColumn x:Name="altIDColumn" Binding="{Binding AltID}" Header="Alt" Width="55"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
这里是绑定引用对象的代码,一个带有可过滤视图的 ViewableCollection 属性:
public class ViewableCollection<T> : ObservableCollection<T>
{
private ListCollectionView _View;
public ListCollectionView View
{
get
{
if (_View == null)
{
_View = new ListCollectionView(this);
}
return _View;
}
}
}
class ObservableDocuments : ViewableCollection<Document>
{
public ObservableDocuments(DataClasses1DataContext dataDc)
{
foreach (Document doc in dataDc.Documents)
{
this.Add(doc);
}
}
}
将 _dataDc 和 _oDoc 移动到 ViewModel class 导致没有任何内容填充数据网格。我究竟做错了什么?似乎无法实例化 ViewModel。
这一行:
DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
意味着您仍在查看 DataContext
的代码隐藏。如果您不知道,DataContext
定义了根对象,所有绑定都查看其 "Path".
的开头
所以你是对的,VM 没有被实例化,因为你从未实例化它。
相反,删除该行并在您的 UI 构造函数中写入:
DataContext = new MainViewModel();
当然还有其他方法,但这是最简单的。
我有一个可以运行的应用程序,现在我正在尝试使用适当的 MVVM 来实现它。正如我从几个月的阅读中了解到的那样,LinqToSQL classes(VS2013)是我的模型,它使用的 SQL 服务器数据库也是如此。 UI 是视图,我正在实现一些 ObservableCollections 作为我的视图模型。所以这是 ViewModel:
partial class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
static DataClasses1DataContext _dataDc = new DataClasses1DataContext();
ObservableDocuments _oDoc = new ObservableDocuments(_dataDc);
public ObservableCollection<Document> oDoc
{
get
{
return _oDoc;
}
}
public ICommand LoadData
{
get;
private set;
}
protected void RaisePropertyChangedEvent(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
在工作版本中,DataContext 和 ObservableDocuments 行位于 MainWindow 代码中。 . .所以我已经移动了它们。这是 xaml:
<Window x:Class="LINQ_MVVM_1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModel="clr-namespace:LINQ_MVVM_1.ViewModel"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"
DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
ItemsSource="{Binding oDoc.View}">
<DataGrid.Columns>
<DataGridTextColumn x:Name="docIDColumn" Binding="{Binding DocId}" Header="ID" Width="65"/>
<DataGridTextColumn x:Name="DocumentNumberColumn" Binding="{Binding Number}" Header="Document Number" Width="*"/>
<DataGridTextColumn x:Name="altIDColumn" Binding="{Binding AltID}" Header="Alt" Width="55"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
这里是绑定引用对象的代码,一个带有可过滤视图的 ViewableCollection 属性:
public class ViewableCollection<T> : ObservableCollection<T>
{
private ListCollectionView _View;
public ListCollectionView View
{
get
{
if (_View == null)
{
_View = new ListCollectionView(this);
}
return _View;
}
}
}
class ObservableDocuments : ViewableCollection<Document>
{
public ObservableDocuments(DataClasses1DataContext dataDc)
{
foreach (Document doc in dataDc.Documents)
{
this.Add(doc);
}
}
}
将 _dataDc 和 _oDoc 移动到 ViewModel class 导致没有任何内容填充数据网格。我究竟做错了什么?似乎无法实例化 ViewModel。
这一行:
DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
意味着您仍在查看 DataContext
的代码隐藏。如果您不知道,DataContext
定义了根对象,所有绑定都查看其 "Path".
所以你是对的,VM 没有被实例化,因为你从未实例化它。
相反,删除该行并在您的 UI 构造函数中写入:
DataContext = new MainViewModel();
当然还有其他方法,但这是最简单的。