更改xaml搜索框,从选择到过滤结果

时间:2018-01-19 15:20:48

标签: c# wpf xaml mvvm

现在,此代码可用于选择一行:

<TextBlock Text="Part Number" Style="{StaticResource tabTextBlock}"/>
<ComboBox ItemsSource="{Binding Vwr.Table.Tbl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          DisplayMemberPath="PN" SelectedValuePath="PN"
          SelectedIndex="{Binding Vwr.Table.SelectedRowIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          Text="{Binding Vwr.Table.Vals[1].Val, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          IsEditable="True" Style="{StaticResource tabTextBox}"/>

如果我在搜索框中输入要查看的PN,它会为我选择PN。我想做的就是更改它,以便过滤掉不匹配的表格结果。

这是一个MVVM系统,我是否需要在相应的viewModel中构建此功能,而不是尝试在xaml文件中执行此操作?

Vwr.Table是我们的主表,Vals是一个ObservableCollection。 Vals[0]是此表中的第一个col,是我们希望过滤的值。

视图模型 使用System.Collections.ObjectModel;

namespace MDB_N2000
{
    public class MPLViewModel : ModuleViewModel
    {
        public MPLViewModel(string name) : base(name)
        {


            Vwr.Table = new MPLTableViewModel();
            SubVwr.Tables[0] = new PartsListTableViewModel();
            SubVwr.Tables.Add(new OnBOMsTableViewModel());
            SubVwr.Tables.Add(new OnKMRsTableViewModel());
            SubVwr.Tables.Add(new OnOrdersTableViewModel());
            SubVwr.Tables.Add(new HasTravellersTableViewModel());
            SubVwr.Tables.Add(new AssyTreeTableViewModel());
            SubVwr.SelectedTableIndex = 0;

        }

    }
}

ObservableCollection Class

1 个答案:

答案 0 :(得分:0)

我不太确定您的ViewModel是什么样的,但以下示例在您键入时会过滤ComboBox值。它通过ComboBoxICollectionView提供数据,ComboBox有一个过滤器集,每次public class ViewModel { private CollectionViewSource _cvs; public ICollectionView CVSView { get { return _cvs.View; } } private string _partNumberSearchText; public string PartNumberSearchText { get { return _partNumberSearchText; } set { if (_partNumberSearchText != value) { _partNumberSearchText = value; NotifyPropertyChanged(); CVSView.Refresh(); } } } private ObservableCollection<string> _coll; public ObservableCollection<string> Coll { get { return _coll; } set { if (_coll != value) { _coll = value; NotifyPropertyChanged(); } } } public ViewModel() { Coll = new ObservableCollection<string> { "String1", "String2", "String3" }; _cvs = new CollectionViewSource { Source = Coll }; CVSView.Filter = ContainsString; } private bool ContainsString(object obj) { if (string.IsNullOrEmpty(PartNumberSearchText)) return true; if (obj.ToString().ToLower().Contains(PartNumberSearchText.ToLower())) return true; return false; } } 中的值发生更改时都会刷新。

这是你要找的东西吗?

<强>视图模型

<ComboBox ItemsSource="{Binding CVSView, UpdateSourceTrigger=PropertyChanged}"
          Text="{Binding PartNumberSearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          IsEditable="True" />

查看

DataTable

<强> UDPATE

以下内容更适合您的示例,例如,绑定到string(在此示例中,我在{{1}中显示第一列(类型为ComboBox) }):

<强>视图模型

public class ViewModel
{
    private CollectionViewSource _cvs;

    public ICollectionView CVSView { get { return _cvs.View; } }

    private string _partNumberSearchText;
    public string PartNumberSearchText
    {
        get { return _partNumberSearchText; }
        set
        {
            if (_partNumberSearchText != value)
            {
                _partNumberSearchText = value;
                NotifyPropertyChanged();
                RefreshCVSView();
            }
        }
    }

    public ViewModel()
    {
        _cvs = new CollectionViewSource { Source = Vwr.Table.Tbl.Rows };

        CVSView.Filter = ContainsString;
    }

    private void RefreshCVSView()
    {
        if (CVSView.CurrentItem != null)
        {
            DataRow currentItem = (DataRow)CVSView.CurrentItem;

            CVSView.Refresh();

            if (Vwr.Table.Tbl.AsEnumerable().Count(item => item[0] == currentItem[0]) > 0)
                CVSView.MoveCurrentTo(Vwr.Table.Tbl.AsEnumerable().First(item => item[0] == currentItem[0]));
        }
        else
        {
            CVSView.Refresh();
        }
    }

    private bool ContainsString(object obj)
    {
        if (string.IsNullOrEmpty(PartNumberSearchText))
            return true;

        DataRow view = obj as DataRow;

        if (view[0].ToString().ToLower().Contains(PartNumberSearchText.ToLower()))
            return true;

        return false;
    }
}

查看

<ComboBox ItemsSource="{Binding CVSView, UpdateSourceTrigger=PropertyChanged}"
          Text="{Binding PartNumberSearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          DisplayMemberPath="[0]" IsEditable="True" />

DisplayMemberPath="[0]"会将显示的值设置为表格中的第一列。

使用此示例,您可以通过CVSView访问当前选定的项目。