我们有一个带有三个标签的标签控件。每个选项卡包含两个用户控件A和B.用户控件A包含数据网格。用户控件B包含一个文本框和一个选中的列表框,用于过滤用户控件A中的数据网格。在上述场景中,两个用户控件之间进行通信的最佳方法是什么? 我正在使用MVVM和Prism Framework的事件聚合器。
我的Viem模型如下所示
User Control A User Control B
Tab1 ViewModelGrid1 ViemModelGridFilter
Tab2 ViewModelGrid2 ViemModelGridFilter
Tab3 ViewModelGrid3 ViemModelGridFilter
我想使用一个ViewModel进行网格过滤。
我从Tab 1的ViemModelGridFilter发布的事件只能由选项卡1的ViewModelGrid1订阅。但是现在它被所有三个网格视图模型订阅。
this._eventAggregator.GetEvent<GridFilterEvent>().Publish(list);
答案 0 :(得分:1)
看一下下面的演示,我将从搜索文本框中提供的文本中过滤一组学生。 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>
TextBox UserControl的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,可以根据需要进行增强,修改,没有太多麻烦。