我想在我的WPF应用程序中使用MVVM。我目前有一个Model和一个包含DataGrid和其他控件的视图。我根据我的模型创建了一个ViewModel,但不知道我是否正确完成了。视图只是一个简单的对话框。我想填充DataGrid视图。
如何告诉DataGrid与ViewModel绑定?
我想将属性(在ID和日期等视图模型中)绑定到数据网格。
所以,如果列表中有两个对象,我希望在datagrid中看到具有特定ID和日期的两行。
我在类中设置datacontext而不是xaml。
以下是目前的代码:
public class ViewModel : INotifyPropertyChanged
{
private string _id;
private DateTime _date;
private ObservableCollection<Object> _list;
public string Id
{
get { return _id; }
set
{
_id = value;
PropertChanged("Id");
}
}
public DateTime Date
{
get { return _date; }
set
{
_date = value;
PropertChanged("Date");
}
}
public ObservableCollection<Object> list
{
get { return _list; }
set
{
_list = value;
PropertChanged("list");
}
}
public LicenseViewModel()
{
list = GetList();
}
public event PropertyChangedEventHandler PropertyChanged;
public void PropertChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
和XAML:
<Window x:Class="Import"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
mc:Ignorable="d"
ResizeMode="CanResizeWithGrip"
x:Name="ImportLicense"
d:DesignHeight="493" d:DesignWidth="559"
Title="Import Licenses" SizeToContent="WidthAndHeight">
<Grid Width="538">
<DataGrid x:Name="Imported" VerticalAlignment="Top" AutoGenerateColumns="False" CanUserResizeColumns="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Entitlement ID" Binding="{Binding Path=ID}"/>
<DataGridTextColumn Header="Date Sold" Binding="{Binding Path=Date}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
答案 0 :(得分:2)
您需要将DataGrid
的数据上下文设置为视图模型的实例。您只需在视图类的构造函数中将View的DataContext
或DataGrid设置为视图模型的实例即可。这是一种快速而肮脏的方式。
如果您想要更复杂,可以在视图类上创建DepenencyProperty
,如下所示:
public static DependencyProperty ViewModelProperty =
DependencyProperty.Register("ViewModel",
typeof(ItemViewModel),
typeof(ViewClassHere));
public ItemViewModel ViewModel
{
get { return (ItemViewModel)base.GetValue(ItemViewModel); }
set { base.SetValue(ItemViewModel, value); }
}
然后你会以多种方式中的任何一种绑定到该属性,但是一种方式就是:
<DataGrid ItemsSource="{Binding ElementName=windowName, Path=viewName.list}">
有很多方法可以做到这一点,这只是两种可行的方法。
答案 1 :(得分:0)
使用datagrid显示数据的常用方法是设置itemssource
<DataGrid ItemsSource="{Binding MyCollection}"/>
您的viewmodel定义了2个属性和一个集合,但在您的xaml中,您将属性绑定到datagrid列,并且不设置任何itemssource。
我不清楚您希望在数据网格中看到什么,但您的2个属性ID和DateTime不属于任何集合,那么为什么要在数据网格中显示它?
请编辑您的问题并提供您希望在数据网格中看到的内容的一些信息。
答案 2 :(得分:0)
试试这样:
<window.Resources>
<ViewModel x:Key="ViewModel"></ViewModel >
</window.Resources>
<Grid x:Name="ValueDetail" DataContext="{StaticResource ViewModel}">
<DataGrid ItemsSource="{Binding MyCollection}"/>
</Grid>