2015-09-23 3 views
1

Я совершенно новой для WPF так Heres мой код:Bind Список <object> для DataGrid WPF, C#

<DataGrid x:Name="dgVarConfig" ItemsSource="{Binding varConfigList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="10,59,0,0" VerticalAlignment="Top" Height="403" Width="1278" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" HeadersVisibility="Column"> 

      <DataGrid.Columns> 
       <DataGridTextColumn Width="auto" Header="Match Ausdruck" Binding="{Binding match_expression}"></DataGridTextColumn> 
      </DataGrid.Columns> 
</DataGrid> 

My Files: MainWindow.xaml, MainController.cs, VarConfigDAO.cs

varConfigDAO .cs возвращает список в MainController, а MainController.cs возвращает его mainWindows.xaml.

Это VarConfig.cs:

public class VarConfig 
    { 
     public int id { get; set; } 
     public String group { get; set; } 
     public String machine { get; set; } 
     public String match_expression { get; set; } 
     public String variant_new_1 { get; set; } 
     public String calc_formula_1 { get; set; } 
     public String variant_new_2 { get; set; } 
     public String calc_formula_2 { get; set; } 
    } 

Это работает, если я установить ItemsSource programmaticly:

dgVarConfig.Itemssource = mainController.loadVarConfigList(); 

Но это еще не то, что я хочу, потому что я хочу, чтобы обновить список с помощью сетки (вставить, удалить, обновить строки => Режим = TwoWay)

Любой ключ, как я могу заполнить itemssource через xaml?

ответ

4

Создайте класс модели представления со свойством, которое содержит коллекцию объектов VarConfig. Коллекция должна уведомить мнение об изменениях (например, добавленные или удаленные элементы). Поэтому соответствующий тип коллекции будет ObservableCollection:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     VarConfigList = new ObservableCollection<VarConfig>(); 
    } 

    public ObservableCollection<VarConfig> VarConfigList { get; private set; } 
} 

Установите DataContext вашего пользовательского интерфейса (например, ваш MainWindow) к экземпляру модели представления, например, в код в конструкторе MainWindow, как это:

public MainWindow() 
{ 
    InitializeComponent(); 

    var viewModel = new ViewModel(); 
    // fill viewModel.VarConfigList 

    DataContext = viewModel; 
} 

Привязать к VarConfigList Недвижимость в XAML. Нет необходимости устанавливать Mode=TwoWay или UpdateSourceTrigger=PropertyChanged, как свойство ItemsSource только связан один конец (в DataGrid - или любой другой ItemsControl - никогда не устанавливает его):

<DataGrid ItemsSource="{Binding VarConfigList}" ...> 
    ... 
</DataGrid> 

Наконец, если вы хотите, чтобы пользовательский интерфейс для реагировать на изменения отдельных VarConfig свойств, он должен реализовать интерфейс INotifyPropertyChanged:

public class VarConfig : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

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

    private int id; 
    public int Id 
    { 
     get { return id; } 
     set 
     { 
      id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 

    // similar code for the other properties 
} 

Обратите внимание на корпус. Широко принято называть имена свойств C# в PascalCase.

+0

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

+0

Вам не нужно перезагружать DataContext, если список изменяется. Когда элементы добавляются или удаляются из списка, это будет сообщено ObservableCollection. Если вы хотите создать новый экземпляр List, класс ViewModel должен также реализовать INotifyPropertyChanged и сообщить об этом свойстве 'VarConfigList'. Найдите в Интернете «MVVM». Это архитектурный образец для создания пользовательского интерфейса, который отлично поддерживается WPF. – Clemens

+0

и как я могу заполнить VarConfigList, если это частный набор? –

0

Вам необходимо установить DataContext для вашего DataGrid, если у него есть varConfigList. Затем DataGrid сможет увидеть varConfigList и сделать это. Вы не даете много кода, поэтому я не могу понять, что вам нужно, но я собираюсь сделать некоторые догадки и посмотреть, помогут ли они.

Есть несколько способов сделать это. Я полагаю, что DataGrid находится в вашем MainWindow, поэтому он обычно наследует его DataContext; но вы также можете установить его индивидуально.

Вот один из возможных способов:

MainWindow

<Window ...> 
    <DataGrid ... ItemsSource={Binding VarConfigList} ... /> 
</Window> 

public partial class MainWindow : Window 
{ 
    ... 
    MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new MainController(); 
    } 
} 

MainController

class MainControler 
{ 
    private var _varConfigList; 
    public var VarConfgList { get { return _varConfigList; } } 
    ... 

    public MainControler() 
    { 
     // set stuff up 
    } 
} 

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

В моем ограниченном опыте сортировка DataContexts была самым большим препятствием при изучении WPF.

+0

Не называйте его контроллером. Это модель взгляда. – Clemens

+0

Согласен, Клеменс, и мне нравится ваш ответ больше, чем мой. Я собираюсь оставить мое, потому что иногда две формы слов могут помочь кому-то понять. Я думаю, как только вы пойдете вокруг DataContexts, использование MVVM намного яснее (но это может быть только я). – PScr

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