绑定到对象的新实例

时间:2013-09-04 16:44:55

标签: c# wpf xaml

我试图弄清楚如何在不破坏任何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绑定保持不变?

2 个答案:

答案 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事件。