我的dataGrid不清除也不刷新

时间:2013-09-19 12:54:57

标签: c# silverlight datagrid datasource

我有两个DataGrid,每个绑定在一个dataSource中,如下所示:

ItemsSource="{Binding Data, ElementName=EmpSource, Mode=TwoWay}"

第一个DataGrid(dgJob)包含Job,第二个(dgEmp),employee链接到job

我希望将所有员工保留在EmpSource中,并在dataGrid中显示仅链接到我的第一个数据网格中所选作业的人员。

所以我在dgJob selectionChanged事件中这样做:

dgEmp.ItemsSource = null;
var lstEmp = EmpSource.DataView.OfType<Emp>().Where(ores => ores.IdJob == itmJobSelect.IdJob).ToList();
dgEmp.ItemsSource = lstEmp;

问题是,当我使用作业更改数据网格中的选定行时,dataGrid没有清除,因此对于每个作业,我都会显示dgEmp中的每个Employees,而我应该只显示那些连接到作业的人员

我可以删除xaml中确定dataSource的行,但是如果我这样做,我必须在dataSource发生更改时刷新dataGrid。

但我没有找到如何刷新它(至少是第一次),除非我在dataSource发生更改后每次都写3行。

有人可以帮我找到解决问题的方法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我建议你使用MVVM设计模式。您应该在视图模型类中加载数据并将其存储在实现INotifyCollectionChanged接口的集合中。 View模型还应该实现INotifyPropertyChanged接口。

当您的员工集合发生更改时,您应按以下代码过滤第二个集合:

Jobs.CollectionChanged += (sender, args) =>
{
    Employees = AllEmployees.Where(c=> c.IdJob == SelectedJob.IdJob);
}

当SelectedJob更改并且DataGrid将被刷新时,您也应该做同样的事情。

仅当您已实现属性更改通知并指定了正确的绑定时,此操作才有效。

以下是您应该编写的属性更改实现的示例:

public class ViewModel : INotifyPropertyChanged
{
    public IEnumerable<Emp> Employees
    {
       get { return _employees; }
       set
       {
           if (_employees != value)
           {
               _employees = value;
               OnPropertyChanged("Employees");
           }
       }
    }

    /* ... */

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

您还应该将视图模型实例分配给DataContext以进行make绑定。例如,在代码隐藏文件构造函数中:

public void Page()
{
    DataContext = new ViewModel();
    InitializeComponent();
}