WPF中选项卡控件中的兄弟用户控件之间的通信

时间:2017-05-18 12:22:07

标签: c# wpf prism

我们有一个带有三个标签的标签控件。每个选项卡包含两个用户控件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);

1 个答案:

答案 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,可以根据需要进行增强,修改,没有太多麻烦。