刷新并通知相关的集合更改

时间:2016-12-19 13:06:37

标签: wpf mvvm binding entity-framework-6

我会尽量简化:

我有以下EF6实体:

public class ParentObject
{
     ICollection<ChildObject> Children {get; set ;}
}

我有ViewModel在哪里

ObservableCollection<ParentObject> ParentCollection { get; set; }
ParentObject SelectedParent { get; set; }
ChildObject SelectedChild { get; set; }

我还有两个ListViews

<ListView Name="lvParents" Margin="5,5,0,5" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding Path=ParentCollection}" SelectedItem="{Binding Path=SelectedParent}">


<ListView Name="lvChildren" Margin="5,5,0,5" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding Path=SelectedParent.Children}" SelectedItem="{Binding Path=SelectedChild}">

所有EF6实体都实施了INotifyPropertyChanged, 我的ViewModel也实现了INotifyPropertyChanged。

如果我在lvParents中更改所选项目,一切都运行良好。 lvChildren的孩子们正在改变。

一旦我删除了孩子,我无法刷新孩子: (项目从数据库中删除,但不能只刷新lvChildren。

以下是我尝试使用的方法:

_dataContext.ChildrenObjects.Remove(SelectedChild);
_dataContext.SaveChanges();
SelectedParent.Children.Remove(SelectedChild);

//here the SelectedParent does not contain the value I removed but no way how to refresh the ItemsSource of lvChildren.

NotifyPropertyChanged("SelectedChild");
NotifyPropertyChanged("SelectedParent.Children");
NotifyPropertyChanged("ParentCollection");

我的问题是,绑定依赖(相关)集合的正确方法是什么,并在更改后刷新它们。我是否需要重载EF6 ICollection并创建我自己的ObservableCollection ??? 这够了吗?

1 个答案:

答案 0 :(得分:0)

  

我的问题是,绑定依赖(相关)集合并在更改后刷新它们的正确方法是什么?

ParentObject的Children属性应该返回一个ObservableCollection:

static function data_output($columns,$data)
{
    $DateFields = include 'DateFields.php';
    $out = array();
    for($i=0,$ien=count($data);$i<$ien;$i++)
    {
        $row = array();
        for($j=0,$jen=count($columns);$j<$jen;$j++)
        {
            $column = $columns[$j];
            if(isset($column['Formatter']))
            {
                echo "Formatter<br>";
                $row[$column['dt']] = $column['Formatter']($data[$i][$column['db']],$data[$i]);
            }
            else
            {   //This is were I added the <div> around the value returned.                 
                $row[$column['dt']] = "<div class='Scrollable'>" .$data[$i][$columns[$j]['db']]. "</div>";
                if(in_array($column['db'],$DateFields,TRUE) && $row[$column['dt']] != '')
                {
                    $row[$column['dt']] = substr($data[$i][$columns[$j]['db']],5,2) . "/" . substr($data[$i][$columns[$j]['db']],8,2) . "/" . substr($data[$i][$columns[$j]['db']],2,2);
                }
            }
        }
        $out[] = $row;
    }
    return $out;
}

当您从集合中删除项目时,ItemsSource将自动刷新:

public class ParentObject
{
    ObservableCollection<ChildObject> Children {get; set ;}
}

这将是最正确的&#34;正确的&#34;根据MVVM设计模式实现这一点的方法。

使用和绑定自动生成的实体类型&#34;原样&#34;在WPF中很少是个好主意。你应该绑定到ObservableCollection&lt; T&gt;属性而不是ICollection&lt; T&gt;如果您希望能够在运行时动态修改集合,那就是那些。