现在,此代码可用于选择一行:
<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;
}
}
}
答案 0 :(得分:0)
我不太确定您的ViewModel是什么样的,但以下示例在您键入时会过滤ComboBox
值。它通过ComboBox
向ICollectionView
提供数据,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
访问当前选定的项目。