我试图弄清楚如何在不破坏任何XAML绑定的情况下创建对象的新实例。现在,我正在使用的是ObservableCollection
,我将其称之为:
Container.MyClass.MyCollection
在我的ViewModel中(通过Kind of Magic实现INPC):
public ObservableCollection<MyObject> Collection
{
get { return Container.MyClass.MyCollection; }
}
在我的观点中:
<StackPanel>
<TextBlock Text="{Binding Collection.Count}" />
<ItemsControl ItemsSource="{Binding Collection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="1" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
所以,如果我试图获得一个'新鲜'的类实例,我可以调用它并使绑定保持不变:
public void WorkingSomewhatFreshInstance()
{
Container.MyClass.MyCollection.Clear();
Container.MyClass.MyCollection.Add(new MyObject() { Name = "Test1" });
Container.MyClass.MyCollection.Add(new MyObject() { Name = "Test2" });
}
但是,如果我称这种方法:
public MyClass BrokenFreshInstance()
{
var myClass = new MyClass();
myClass.MyCollection.Add(new MyObject() { Name = "Test1" });
myClass.MyCollection.Add(new MyObject() { Name = "Test2" });
return myClass;
}
然后:
Container.MyClass = Initialize.BrokenFreshInstance();
绑定不再更新。有没有办法使用对象的新实例并使XAML绑定保持不变?
答案 0 :(得分:1)
您可以通过调用Observable上的PropertyChanged来告诉View刷新绑定到新实例:
public ObservableCollection<MyObject> Collection
{
get { return _collection; }
set
{
_collection = value;
RaisePropertyChangedEvent("Collection");
}
}
您需要将集合分配给此属性以触发事件:
Collection = Container.MyClass.MyCollection; //This will trigger the PropertyChangedEvent
...
Container.MyClass = Initialize.BrokenFreshInstance();
Collection = Container.MyClass.MyCollection; // Trigger again..
或者您可以通过执行以下操作手动提升更改:
Container.MyClass = Initialize.BrokenFreshInstance();
RaisePropertyChangedEvent("Collection");
答案 1 :(得分:0)
如果属性返回的实例发生更改,则需要为PropertyChanged
触发Collection
事件。