【问题标题】:TextChanged event of TextBox in GridView WPF MVVMGridView WPF MVVM中TextBox的TextChanged事件
【发布时间】:2014-01-14 04:55:12
【问题描述】:

我是 MVVM 模式的新手。我有一个表格,其中包括一个TextBox 和一个DataGrid。我的DataGridObservableCollection 绑定。我想要的是能够使用TextBoxTextChanged 事件进行搜索并在DataGrid 中显示结果。

我在GridView 中使用TextBox 及其在模型视图-视图模型中。基本上,我想要做的是每次编辑框中的文本时调用一个方法。即当输入文本时,该函数将调用。那就是文本更改事件应该起作用。但是在模型视图-视图模型中,我能做什么呢?请帮助我。任何想法....

【问题讨论】:

  • 我已经做到了,但要正确地做到这一点是一项比您意识到的更大的任务。你还有什么要开始的吗?
  • 在文本框中,我知道工作,但在网格视图中的文本框,我不知道...请帮助
  • @user3192678:WPF 上下文中的“GridView”是什么意思?您是指带有 GridView 的 ListView 吗?如果有,ListView 的项目源是什么,它与 DataGrid 的项目源有什么关系?
  • 在 ListView 中,我选择视图为 GridView.... ItemsSource= "{Binding Path= Stocks}"
  • 您还没有回答项目来源之间的关系。请展示您的 XAML 并查看模型。

标签: c# wpf gridview mvvm


【解决方案1】:

您在绑定到文本框的属性的设置器中触发该函数。您还必须将绑定的 UpdateSourceTrigger 设置为 PropertyChanged,以便在每次更改文本框的内容时触发它。

setter 中触发的函数应该更新 ObservableCollection,这将导致 DataGrid 更新其内容。

请看下面的代码示例,代码不会编译,但显示了大致的思路。

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;
  }
}

【讨论】:

  • 哦,我错过了那部分。然后,您必须创建一个子视图模型,该模型具有文本框中文本的属性,然后将 GridView 绑定到这个新视图模型的集合。如果您需要在此视图模式下引用集合,您可以在子视图模型的构造函数中包含对顶视图模型的引用,或者您可以使用某种形式的消息传递,例如使用 MVVM Light Toolkit 中的 Messenger 类。
  • 这有什么例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
相关资源
最近更新 更多