看看下面的演示,我正在从搜索文本框中提供的文本中过滤一组学生。 Datagrid 和 Textbox,都在不同的用户控件中,共享相同的数据上下文。
Datagrid UserControl 的 XAML:
<Grid>
<DataGrid Name="studentGrid" CanUserAddRows="False" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False" ItemsSource="{Binding Students, Mode=TwoWay}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Student's grade" Binding="{Binding StudentGrade}">
</DataGridTextColumn>
<DataGridTextColumn Header="Student's Name" Binding="{Binding StudentName}">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
文本框用户控件的 XAML:
<Grid>
<TextBox Text="{Binding SearchText,UpdateSourceTrigger=PropertyChanged}" Height="30" Width="100" HorizontalAlignment="Left"></TextBox>
</Grid>
XAML 放置在选项卡控件中:
<StackPanel>
<local:tb></local:tb>
<local:dg></local:dg>
</StackPanel>
视图模型:
public class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
Students = new ObservableCollection<Student>();
Students.Add(new Student { StudentGrade = 1, StudentName = "Jack" });
Students.Add(new Student { StudentGrade = 2, StudentName = "Jill" });
Students.Add(new Student { StudentGrade = 3, StudentName = "Humpty" });
}
private string _SearchText;
//to be used to filer datagrid
public string SearchText
{
get { return _SearchText; }
set
{
_SearchText = value;
//filter logic, I am filtering on base of student name, you can have your own implementation.
Students = new ObservableCollection<Student>(Students.Where(x => x.StudentName.ToUpper().Contains(value.ToUpper())).ToList());
NotifyPropertyChanged("SearchText");
}
}
private ObservableCollection<Student> _students;
// to hold list of students
public ObservableCollection<Student> Students
{
get { return _students; }
set
{
_students = value;
NotifyPropertyChanged("Students");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
}
}
以及分配 DataContext XAML.cs 文件的代码:
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
这种方法是纯 MVVM,可以根据需要进行增强和修改,无需太多麻烦。