我会尽量简化:
我有以下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 ??? 这够了吗?
答案 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;如果您希望能够在运行时动态修改集合,那就是那些。