2014-01-14 4 views
1

Я новичок в шаблоне MVVM. У меня есть форма, которая включает в себя один TextBox и один DataGrid. Мой DataGrid связывание с ObservableCollection. Я хотел бы иметь возможность провести поиск с TextChanged событием TextBox и показать результат в DataGrid.Событие TextChanged для TextBox в GridView WPF MVVM

Я использую TextBox в GridView и его модели Model View-View Model. В принципе, то, что я хочу сделать, это вызов метода каждый раз, когда текст в поле редактируется. То есть, когда текст вводится, функция вызовет. Это событие изменения текста должно работать. Но в модели Model View-View, что я могу сделать? Пожалуйста, помогите мне. Любая идея ....

+3

я сделал это, но, чтобы сделать это правильно это большая задача, чем вы понимать. С чего начать? – slugster

+0

В текстовом поле я знаю рабочее, но текстовое поле в виде сетки, я понятия не имею ... пожалуйста, помогите – Jinesh

+0

@ user3192678: что означает «GridView» в контексте WPF? Вы имеете в виду какой-то ListView с GridView? Если да, то каков источник элементов для ListView и как он связан с источником элементов для DataGrid? – Dennis

ответ

1

Вы запускаете функцию в настройщике свойства, которое вы связываете с текстовым полем. Вы также должны установить UpdateSourceTrigger привязки к PropertyChanged, чтобы заставить его запускать каждый раз, когда вы изменяете содержимое текстового поля.

Функция, инициированная в сеттере, должна обновлять ObservableCollection, что приведет к тому, что DataGrid обновит его содержимое.

Se пример кода ниже, код не компилируется, но показывает общую идею.

XAML:

<DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBox Text="{Binding Text}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

SubviewModel.cs:

public SubViewModel(ViewModel vm) 
{ 
    _vm = vm; 
} 

private string _text; 
private ViewModel _vm; 

public string Text 
{ 
    get 
    { 
    return _text; 
    } 
    set 
    { 
    if (_text == value) 
    { 
     return; 
    } 

    _text = value; 
    OnPropertyChanged("Text"); 
    RefreshResult(); 
} 

private void RefreshResult() 
{ 
    // Do something with the _text and manipulate the _vm.Rows? 
} 

ViewModel.cs:

private ObservableCollection<SubViewModel> _rows; 
public ViewModel() 
{ 
    //Initialize the sub view models 
    _rows = new ObservableCollection<SubViewModel>(); 

    //Populate the list somehow 
    foreach (var r in sourceOfRows) 
    { 
     _rows.Add(new SubViewModel(this)); 
    } 
} 

public ObservableCollection<SubViewModels> Rows 
{ 
    get 
    { 
    return _rows; 
    } 
} 
+0

О, я пропустил эту часть. Затем вам нужно создать модель подзадачи, которая имеет свойство для текста в текстовом поле, а затем привязывает GridView к коллекции этой новой модели представления. Если вам нужна ссылка на коллекцию в этом режиме просмотра, вы можете включить ссылку на модель верхнего вида в конструкторе для модели подзадачи, или вы можете использовать некоторую форму сообщения, например, использовать кластер Messenger в MVVM Light Toolkit. –

+0

Любой пример для этого? – Jinesh

+0

Я отредактирую свой ответ –

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