Сетка данных инструментария wpf - PullRequest
0 голосов
/ 09 июня 2009

привет, я создаю приложение wpf с сетками данных, модель является моделью вида модели.

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

В любом случае, моя проблема со столбцом со списком, контекст данных - это представленный объект, и мне нужно, чтобы он был моделью представления.

какое лучшее решение?

Ответы [ 4 ]

0 голосов
/ 18 июня 2009

В результате мы получили классы со статическими свойствами для каждого из наших списков со списком:

(вы не можете сделать сам класс статическим, иначе XAML не сможет его открыть, но вы не получите ошибок компиляции)

Например:

public class ZoneList
{
  private static readonly IList<Zone> _Items = new List<Zone>();
  public static IList<Zone> Items
  {
    get { return _Items; }
  }
}

и затем в XAML:

<UserControl.Resources>
    <ResourceDictionary>
        <ObjectDataProvider x:Key="myZoneList"   ObjectType="{x:Type StaticLists:ZoneList}"/>
    </ResourceDictionary>
</UserControl.Resources>

<ComboBox ItemsSource="{Binding Path=Items, Source={StaticResource myZoneList}}"></ComboBox>
0 голосов
/ 14 июня 2009

это то, как я использовал ViewModel с ComboBoxes, DataContext - это ViewModel, а не основная сущность (Список ).

ViewModel (Person - это простой класс с именем и возрастом):

public class PeopleViewModel : INotifyPropertyChanged
{
    private List<Person> _peopleList;
    private Person _selectedPerson;

    public PeopleViewModel()
    {
        // initialize with sample data
        _peopleList = getPeopleList();
    }

    // gets sample data
    private List<Person> getPeopleList()
    {
        var result = new List<Person>();
        for (int i = 0; i < 10; i++)
        {
            result.Add(new Person("person " + i, i));
        }
        return result;
    }

    public List<Person> PeopleList
    {
        get { return _peopleList; }
    }

    public Person SelectedPerson
    {
        get { return _selectedPerson; }
        set
        {
            if (_selectedPerson == value) return;
            _selectedPerson = value;
            // required so that View know about changes
            OnPropertyChanged("SelectedPerson");
        }
    }
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    // WPF will listen on this event for changes
    public event PropertyChangedEventHandler PropertyChanged;
}

XAML для ComboBox:

<ComboBox Name="cmbEnum" Width="150" ItemsSource="{Binding Path=PeopleList}" SelectedValue="{Binding Path=SelectedPerson}" SelectedValuePath="" DisplayMemberPath="Name" ></ComboBox>

И в коде позади я могу сделать:

    public Window2()
    {
        InitializeComponent();

        vm = new PeopleViewModel();
        // we are listening on changes of ViewModel, not ComboBox
        vm.PropertyChanged += new PropertyChangedEventHandler(vm_PropertyChanged);
        this.DataContext = vm;
    }

    void vm_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
    if (e.PropertyName == "SelectedPerson")
    {
        MessageBox.Show(vm.SelectedPerson.Age.ToString());
    }
    }

    // button1_Click should be probably replaced by Command
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        // sample showing that GUI is updated when ViewModel changes
    vm.SelectedPerson = vm.PeopleList[2];
    }

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

0 голосов
/ 15 июня 2009

Я обнаружил, что лучший способ реализовать это - определить некоторый внешний класс для всех поисков, которые я использую в сетке, и встроить их в шаблон как статический ресурс

0 голосов
/ 12 июня 2009

Я использую другую сетку данных, но она может быть похожей. То, как я это сделал, было так:

в XAML, я определил ObjectDataProvider в ресурсах:

<ObjectDataProvider x:Key="VM" ObjectInstance="{x:Null}" x:Name="vm"/>

затем после присвоения DataContext (конструктор или событие DataContextChanged) я сделал это:

(this.Resources["VM"] as ObjectDataProvider).ObjectInstance = this.DataContext;

В Combobox xaml я использовал это как источник привязки:

ItemsSource="{Binding Source={StaticResource VM}, Path=SomeItems, Mode=OneWay}"

Не уверен, работает ли он для сетки данных Microsoft, но я думаю, стоит попробовать.

...