2009-06-08 3 views
0

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

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

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

Какое оптимальное решение?

ответ

0

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

0

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

в 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}" 

Не уверен, что он работает для datagrid microsoft, но я думаю, что стоит попробовать.

+0

Xceed экспресс сетки? – abmv

+0

Да.Насколько я знаю, поскольку оба элемента не являются непосредственно частью визуального дерева, это может сделать что-то подобное. – Botz3000

0

вот как я использовал ViewModel с ComboBoxes, DataContext - это ViewModel, а не базовый объект (список < Лицо >).

ViewModel (Лицо является простым классом с именем и возрастом):

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 в коде, и View может быть заменен.

0

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

(вы не сделать сам класс статический иначе 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^