Использовать MVVM для диалогового окна WPF - PullRequest
1 голос
/ 28 апреля 2011

Я хочу использовать MVVM в своем приложении WPF. В настоящее время у меня есть Модель и представление, которое имеет DataGrid и некоторые другие элементы управления. Я создал ViewModel на основе моей модели и не знаю, правильно ли я это сделал. Представление - просто простое диалоговое окно. Я хочу заполнить представление DataGrid.

Как я могу сказать, чтобы DataGrid связывался с ViewModel?

Я хотел бы привязать свойства (внутри viewmodel, такие как ID и Дата) к сетке данных .

ТАК как если бы в списке было два объекта, я бы хотел видеть две строки в сетке данных с конкретными идентификаторами и датами.

Я устанавливаю текстовый текст внутри класса вместо 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 ]

2 голосов
/ 28 апреля 2011

Вам необходимо установить контекст данных для DataGrid для экземпляра вашей модели представления. Вы можете сделать это, просто установив DataContext вашего View или 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}">

Существует множество способов сделать это, это всего лишь два возможных способа сделать это.

0 голосов
/ 28 апреля 2011

Попробуй так:

<window.Resources>             
<ViewModel  x:Key="ViewModel"></ViewModel >
</window.Resources>
<Grid  x:Name="ValueDetail"  DataContext="{StaticResource ViewModel}">
<DataGrid ItemsSource="{Binding MyCollection}"/> 
</Grid>
0 голосов
/ 28 апреля 2011

Обычный способ отображения данных с сеткой данных состоит в том, чтобы задать источник элементов

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

ваша модель представления определяет 2 свойства и одну коллекцию, но в вашем xaml вы привязываете свои свойства к столбцам таблицы данных и неустановить любой источник данных.

мне не ясно, что вы хотели бы видеть в вашей сетке данных, но ваши 2 свойства ID и DateTime не являются частью какой-либо коллекции, так почему вы хотите, чтобы это отображалось в вашей сетке данных?

Пожалуйста, отредактируйте свой вопрос и дайте некоторую информацию о том, что вы хотите видеть в своей таблице данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...