2013-09-04 4 views
0

Я пытаюсь выяснить, как создать новый экземпляр объекта, не нарушая привязки XAML. Сейчас все, что я работаю с это ObservableCollection, который я буду называть:Связывание с новым экземпляром объекта

Container.MyClass.MyCollection 

В моей ViewModel (с 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 остаются нетронутыми?

ответ

1

Вы можете сказать View, чтобы обновить привязку к новому экземпляру, вызвав PropertyChanged на Observable:

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"); 
+0

Ваше первое решение работало. Однако, поскольку я использую Kind of Magic, мне даже не пришлось вручную вызывать 'RaisePropertyChanged'; Мне просто нужно было назначить поле и сеттер. Есть ли способ обойти это и все еще иметь возможность просто вернуть значение из геттера? В любом случае, я ценю вашу помощь! –

+0

Кроме того, свойство находится в другом ViewModel, чем в команде, поэтому я не думаю, что ваш второй ответ будет работать для меня. –

+0

Поцарапайте, что после того, как значение присвоено вручную, авто-свойства работают нормально. Спасибо за вашу помощь! –

0

Вам необходимо запустить событие PropertyChanged для Collection, если экземпляр, возвращаемый собственностью, изменится.

Смежные вопросы