使用MVVM for WPF对话框

时间:2011-04-28 00:59:42

标签: wpf data-binding mvvm datagrid

我想在我的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>

3 个答案:

答案 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>