为了保持 View 和 ViewModel devided 而不是使用 CodeBehind 进行逻辑,我建议使用 DataGrid 和 Binding 进行搜索,所以 View 就像:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="0"></TextBox>
<TextBlock Text="{Binding SearchResult}" Grid.Row="0" Grid.Column="1"></TextBlock>
<DataGrid ItemsSource="{Binding Entries}" Grid.Row="1" Grid.ColumnSpan="2">
</DataGrid>
</Grid>
所以 SearchText 是要搜索的内容,而 SearchResult 是结果。两者都绑定到 ViewModel。并且 Connected View Model 包含 DoSearchBay() 用于使用当前 SearchText 的值更新 SearchResult 字段,代码如下:
public class ViewModel: INotifyPropertyChanged
{
private String _searchText = "Bay?";
private String _searchResult = "N/A";
public ObservableCollection<MyDataObject> Entries { get; set; }
public string SearchText
{
get => _searchText;
set
{
if (value == _searchText) return;
_searchText = value;
DoSearchBay();
OnPropertyChanged();
}
}
private void DoSearchBay()
{
var sel = Entries.Select((dm, index) => new { index, dm.Bay}).FirstOrDefault(obj => obj.Bay.Equals(_searchText, StringComparison.OrdinalIgnoreCase)) ;
if (sel != null)
{
SearchResult = "Found in row " + sel.index;
}
else
{
SearchResult = "N/A";
}
}
public string SearchResult
{
get => _searchResult;
set
{
if (value == _searchResult) return;
_searchResult = value;
OnPropertyChanged();
}
}
public ViewModel()
{
//Create Fake values
Entries = new ObservableCollection<MyDataObject>();
Entries.Add(new MyDataObject() {Bay = "Bay1", Am9 = "value1-1", Am10 = "value1-2", Am11 = "value1-3" });
Entries.Add(new MyDataObject() { Bay = "Bay2", Am9 = "value2-1", Am10 = "value2-2", Am11 = "value2-3" });
Entries.Add(new MyDataObject() { Bay = "Bay3", Am9 = "value3-1", Am10 = "value1-2", Am11 = "value3-3" });
}
// ToDo Implement INotifyPropertyChanged...
}
包含数据的模型看起来像:
public class MyDataObject
{
public String Bay { get; set; }
public String Am9 { get; set; }
public String Am10 { get; set; }
public String Am11 { get; set; }
}