Расширьте мои модели - PullRequest
1 голос
/ 30 июля 2011

Я работаю над WPF MVVM фреймворком

У меня есть ItemType Модель

public class ItemType
{
    public long ItemTypeID { get; set; }
    public long ItemCategoryID { get; set; }
    public string Name { get; set; }
}

и другие ItemCategory Модель

public class ItemCategory
{
    public long ItemCategoryID { get; set; }
    public string Name { get; set; }
}

Теперь я хочу привязать ItemType к сетке данных, но я не хочу показывать ItemCategoryID. Я хочу показать ItemCategory.Name

Как это можно сделать, не меняя исходный класс?

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Для этого MVVM использует ViewModel.

Не изменяйте модель, а создавайте классы ViewModel, структурированные в соответствии с потребностями представления.это то место, где вы не указали бы свойства, которые вам не нужны.

РЕДАКТИРОВАТЬ

Вот способ сделать это:

public class ItemTypeViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

    private string category;
    public string Category
    {
        get { return category; }
        set
        {
            if (category != value)
            {
                category = value;
                OnPropertyChanged("Category");
            }
        }
    }

    public static ItemTypeViewModel FromModel(ItemType model)
    {
        var itemTypeViewModel = 
            new ItemTypeViewModel 
            {
                Name = model.Name,
                Category = categories[model.CategoryID].Name;
            };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        var p = PropertyChanged;
        if (p != null)
        {
            p(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class ItemTypesViewModel : ObservableCollection<ItemTypesViewModel>
{
    private ObservableCollection<ItemTypeViewModel> _collection;

    public ObservableCollection<ItemTypeViewModel> Collection
    {
        get { return _collection; }
        set
        {
            if (_collection != value)
            {
                _collection = value;
                OnPropertyChanged(new PropertyChangedEventArgs("Collection"));
            }
        }
    }
}

Используйте статический метод для создания экземпляров ItemTypeViewModel для каждого ItemType в модели.Поместите их все в свойство 'Collection' ItemTypeSViewModel.

Привязать DataGrid к коллекции.

Я "удалил" отношение, существующее в вашей модели между ItemType и ItemCategory измоя ViewModel.Это всего лишь один из способов справиться с такой конструкцией.Вместо этого вы также можете создать класс ViewModel для ItemCategory и иметь ссылку в классе ItemTypeViewModel на экземпляр класса ItemCategoryViewModel.

Обратите внимание, что это только один из способов справиться с этим.Вы можете решить эту проблему и другими способами.Также: вам нужно будет обеспечить преобразование классов ViewModel обратно в модель.

Последний совет: если вы новичок, начните читать / смотреть учебные пособия по MVVM: https://stackoverflow.com/questions/2267903/learning-mvvm-for-wpf

2 голосов
/ 30 июля 2011

Ответ, предоставленный обоими парнями, совершенно верен и соответствует вашим потребностям, насколько я понял ваш вопрос. Основная идея:

@ Амани:

//check if the query fits your needs
var temp = from i in categoryList
                   from it in itemList
                   where i.ItemCategoryID == it.ItemCategoryID 
                   select new { i, it };

Создайте перекрестный запрос для создания нового составного типа , который может быть

public class ItemTypeViewModel
{
    public long ItemTypeID { get; set; }
    public string ItemCategoryName { get; set; }
    public string ItemTypeName { get; set; }
}

это соответствует директиве MVVM, написанной @Erno. Используйте коллекцию объектов ItemTypeViewModel, чтобы связать их с вашим представлением.

Надеюсь, это поможет.

Привет.

1 голос
/ 30 июля 2011

Если это ваша модель базы данных, вы можете легко составить представление для объединения этих таблиц.или вы можете использовать следующий код в качестве шаблона:

        var temp = from i in categoryList
                   from it in itemList
                   where i.ItemCategoryID == it.ItemCategoryID 
                   select new { i, it };

Надеюсь, эта помощь.

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