Как создать модель для модели с коллекцией - PullRequest
1 голос
/ 08 июля 2010

У меня есть класс:

public class Car
{        
    public string Name { get; set; }
    public int Age { get; set; }
    public Wheel[] Wheels {get;set;}       
}

Коллекции колес могут быть изменены

Все свойства автомобиля будут отображаться с одинаковым контролем

Я хочу увидетьКак сделать ViewModel для этого класса.

Хорошо ли я понял концепцию MVVM?

public class CarViewModel()
{
ObservableCollection<Wheel> _wheels{ get; set; }
Car _car {get;set;}

public ObservableCollection<Wheel> Wheels
{
get{ return this._car.Wheels;}
set{ this._car.Wheels=value}
}

public string Name
{
get{ return this._car.Name;}
set{ this._car.Name=value}
}


public int Age
{
get{ return this._car.Age;}
set{ this._car.Age=value;}
}
public CarViewModel()
{
this._car=GetCar();
}
}
}

Я вставляю код моего приложения, где у меня есть проблема с этим MVVM (я не уверен в хорошей реализации, и удаление Facility нене работает. Не могли бы вы помочь мне восстановить этот код?

Part of UserControlHotelDescription.xaml

<ListBox Grid.Column="1" ItemsSource="{Binding Path=CheckedRoomFacilities}">
                            <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <CheckBox IsChecked="{Binding Path=IsChecked}" Click="CheckBox_Click"/>
                                    <TextBlock Text="{Binding Path=Name}" />
            </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>

                    </ListBox>

public partial class UserControlHotelDescription : UserControl
    {
        public UserControlHotelDescription()
        {
            InitializeComponent();
        }


        private void CheckBox_Click(object sender, RoutedEventArgs e)
        {

            CheckBox checkBox = sender as CheckBox;
            CheckableFacility checkableFacility = checkBox.DataContext as CheckableFacility;

            if (checkBox.IsChecked.GetValueOrDefault())
            {
                ((HotelDescriptionModelView)this.DataContext).RoomFacilities.Add(new Facility() { Name = checkableFacility.Name,Id=checkableFacility.Id });
            }
            else
            {

            ((HotelDescriptionModelView)this.DataContext).RoomFacilities.Remove(((HotelDescriptionModelView)this.DataContext).RoomFacilities.Where(ce => ce.Id == checkableFacility.Id).First());
            }
        }
    }

public class HotelDescriptionModelView
    {
        public HotelDescription HotelDescription { get; set; }

        List<Facility> AvailableFacilities { get; set; }

        public HotelDescriptionModelView()
        {

//there is Equal to: HotelDescription =GetHotelDescription() 
HotelDescription = new HotelDescription();
            HotelDescription.Name = "Hilton";

            List<Facility> gotFacilities = new List<Facility>();
            gotFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Relax, Id = 1, Name = "Jacuzzi", FacilityType = FacilityType.Room });
            gotFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Sport, Id = 2, Name = "Trash", FacilityType = FacilityType.Room });
            gotFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Sport, Id = 4, Name = "Chairlift", FacilityType = FacilityType.SkiSlope });

            HotelDescription.Facilities = gotFacilities.ToArray();

            AvailableFacilities = new List<Facility>();
            AvailableFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Relax, Id = 1, Name = "Jacuzzi", FacilityType = FacilityType.Room });
            AvailableFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Relax, Id = 2, Name = "Trash", FacilityType = FacilityType.Room });
            AvailableFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Relax, Id = 3, Name = "AirCondition", FacilityType = FacilityType.Room });
            AvailableFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Relax, Id = 4, Name = "Chairlift", FacilityType = FacilityType.SkiSlope });
            AvailableFacilities.Add(new Facility() { FacilityCategory = FacilityCategory.Relax, Id = 5, Name = "T-bar lift", FacilityType = FacilityType.SkiSlope });

        }
        public string Name
        {
            get
            {
                return this.HotelDescription.Name;
            }
            set
            {
                this.HotelDescription.Name = value;
            }
        }

        public List<Facility> RoomFacilities
        {
            get
            {

                return
                    this.HotelDescription.Facilities.Where(
                        f => f.FacilityType == FacilityType.Room).ToList();

            }
            set
            {
                this.RoomFacilities = value;

            }
        }
        public CheckableFacility[] CheckedRoomFacilities
        {
            get
            {

                return (from fl in AvailableFacilities.Where(af => af.FacilityType == FacilityType.Room).Union(RoomFacilities)
                        group fl by fl.Name into d
                        select new CheckableFacility()
                                   {
                                       Name = d.Key,
                                       IsChecked = (d.Count() > 1)
                                   }).ToArray();

            }
            set
            {

                this.CheckedRoomFacilities = value;

            }
        }


    }

public class CheckableFacility
    {
        public int Id { get; set; }

        public FacilityCategory ReporterFacilityCategory { get; set; }

        public bool IsChecked { get; set; }

        public string Name { get; set; }


    }

1 Ответ

5 голосов
/ 08 июля 2010

Собираетесь ли вы создать ViewModel для каждой вашей модели? Боюсь.

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

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

После того, как вы создали модель, держите ее в стороне. Затем создайте вид. Проверьте, какие данные необходимы для привязки. Создайте столько свойств в ViewModel, сколько требуется для представления. Большая часть данных будет зависеть от модели (это могут быть разные модели) или от происхождения данных в модели. Следовательно, создайте необходимые экземпляры модели, чтобы их свойства могли быть получены и установлены через ViewModel.

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

Обновление

HotelDescriptionModelView:

/* This ViewModel is to serve UserControlHotelDescription */
public class HotelDescriptionModelView 
{
    HotelDescription _hotelDescriptionModel;
    public ObservableCollection<CheckableFacilityViewModel> CheckableRoomFacilities { get; set; }

    public HotelDescriptionModelView()
    {
        _hotelDescriptionModel = new HotelDescription();
        CheckableRoomFacilities = new ObservableCollection(GetCheckableFacilities(FacilityType.Room)); 
    }

    IEnumerable<CheckableFacilityViewModel> GetCheckableFacilities(FacilityType type)
    {
        return (
                    from fl in AvailableFacilities.Where(af => af.FacilityType == type)
                                                  .Union(RoomFacilities) 
                    group fl by fl.Name into d 
                    select new CheckableFacilityViewModel() 
                    { 
                        Name = d.Key, 
                        IsChecked = (d.Count() > 1) 
                    }
                );
    }
}

CheckableFacilityViewModel:

/* CheckableFacility has to be a viewmodel to serve the 
   ListViewItem in the UserControlHotelDescription (and other views) */
public class CheckableFacilityViewModel
{ 
    public int Id { get; set; }  /* I'm not sure if you use Id in your View */
    public FacilityCategory ReporterFacilityCategory { get; set; }  
    public bool IsChecked { get; set; } 
    public string Name { get; set; }  
} 

CheckableFacilityView:

/* The ListViewItem has to be another View(usercontrol) 'CheckableFacilityView' */
<UserControl>
    <StackPanel Orientation="Horizontal"> 
        <CheckBox IsChecked="{Binding Path=IsChecked}"/> 
        <TextBlock Text="{Binding Path=Name}" />
    </StackPanel>
</UserControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...