“将MVVM用于WPF”对话框

“将MVVM用于WPF”对话框,wpf,data-binding,mvvm,datagrid,Wpf,Data Binding,Mvvm,Datagrid,我想在我的WPF应用程序中使用MVVM。我目前有一个模型和一个视图,其中包含DataGrid和一些其他控件。我根据我的模型创建了一个ViewModel,不知道是否正确。视图只是一个简单的对话框。我想填充DataGrid视图 如何让DataGrid与ViewModel绑定 我想将属性(在viewmodel内部,如ID和日期)绑定到datagrid 因此,如果列表中有两个对象,我希望在datagrid中看到两行具有特定ID和日期的对象。 Im在类中设置datacontext,而不是xaml 以下是迄

我想在我的WPF应用程序中使用MVVM。我目前有一个模型和一个视图,其中包含DataGrid和一些其他控件。我根据我的模型创建了一个ViewModel,不知道是否正确。视图只是一个简单的对话框。我想填充DataGrid视图

如何让DataGrid与ViewModel绑定

我想将属性(在viewmodel内部,如ID和日期)绑定到datagrid

因此,如果列表中有两个对象,我希望在datagrid中看到两行具有特定ID和日期的对象。

Im在类中设置datacontext,而不是xaml

以下是迄今为止的代码:

公共类视图模型:INotifyPropertyChanged
{
私有字符串_id;
私人日期时间(日期);;
私有可观察收集列表;
公共字符串Id
{
获取{return\u id;}
设置
{
_id=值;
财产变更(“Id”);
}
}
公共日期时间日期
{
获取{return\u date;}
设置
{
_日期=价值;
财产变更(“日期”);
}
}
公共可观测收集列表
{
获取{return\u list;}
设置
{
_列表=值;
财产变更(“清单”);
}
}
公共许可证查看模型()
{
list=GetList();
}
公共事件属性更改事件处理程序属性更改;
public void PropertChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的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>

您需要将
DataGrid
的数据上下文设置为视图模型的实例。您可以通过简单地将视图的
DataContext
或DataGrid设置为视图类构造函数中视图模型的实例来实现这一点。这是一种快速而肮脏的方法

如果希望更复杂,可以在视图类上创建一个
depenncyproperty
,如下所示:

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); }
}
<window.Resources>             
<ViewModel  x:Key="ViewModel"></ViewModel >
</window.Resources>
<Grid  x:Name="ValueDetail"  DataContext="{StaticResource ViewModel}">
<DataGrid ItemsSource="{Binding MyCollection}"/> 
</Grid>
然后您可以通过多种方式中的任意一种绑定到该属性,但有一种方式类似于:

<DataGrid  ItemsSource="{Binding ElementName=windowName, Path=viewName.list}">


有很多方法可以做到这一点,这只是两种可能的方法。

使用datagrid显示数据的常用方法是设置itemssource

 <DataGrid ItemsSource="{Binding MyCollection}"/>

viewmodel定义了2个属性和一个集合,但在xaml中,您将属性绑定到datagrid列,而不设置任何itemssource

我不清楚您希望在datagrid中看到什么,但是您的2个属性ID和DateTime不是任何集合的一部分,所以为什么要在datagrid中显示它

请编辑您的问题,并提供一些您希望在datagrid中看到的信息。

尝试如下:

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); }
}
<window.Resources>             
<ViewModel  x:Key="ViewModel"></ViewModel >
</window.Resources>
<Grid  x:Name="ValueDetail"  DataContext="{StaticResource ViewModel}">
<DataGrid ItemsSource="{Binding MyCollection}"/> 
</Grid>


我无法理解的一件事是,viewModel如何与datagrid关联,以及viewModel中的每个属性如何自动绑定到datagrid的列。我尝试了你的建议,但它对我不起作用。让我们详细解释一下im askin:在datacontext调用viewMOdel的构造函数之后,它将在内部填充列表。但是其他两个属性ID和Date呢。它们如何与数据网格绑定。@alice7很抱歉,当您绑定到数据网格时,我没有正确思考您希望不将DataContext绑定到视图,而是绑定ItemsSource,以便ItemsSource=“{Binding ElementName=windowName,Path=viewName.list}”我解决了这个问题。我没有在xaml中进行绑定,而是在.cs文件后面使用itemsources将其绑定到viewModel,并且成功了。对不起,我不清楚我想要什么。我想在datagrid中查看viewmodel中的那些属性。我通过在viewmodel的背面使用itemsources而不是在xaml中解决了这个问题。