2013-10-07 50 views
2

使用WPF,MVVM。我有一個控件,ModifyZooControl,它是一個UserControl。這是一個控件,因爲我想將它添加到多個窗口。如何從UserControl修改綁定的ObservableCollection(如果DataContext來自託管窗口)?

其中一個窗口是ModifyZooWindow,它從MVVMLight獲取DataContext。 我添加在窗口的XAML用戶控制:

<uc:ModifyZooControl/> 

的ModifyZooControl了這一點,上市動物園實例的ObservableCollection<Animal> Animals屬性:

<ListBox Name="Animals" ItemsSource="{Binding Animals}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Label Content="{Binding Path=Name}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

到目前爲止是這種情況,我有窗口,裏面它的ModifyZooControl列出了動物。

接下來,我想從控件的代碼隱藏中修改動物列表。我怎麼做?

Animals.Items.Add(newAnimal)不起作用,因爲「ItemsSource正在使用時操作無效,而是使用ItemsControl.ItemsSource來訪問和修改元素」。

如何從UserControl的代碼隱藏中獲取原始viewmodel Animals observablecollection?

據我所知,一個選擇是爲UserControl添加ObservableCollections的兩個屬性。從Window實例化UserControl時設置它們的值。然後我會引用原始的ObservableCollections,並可以修改它們。 但是,真的需要,考慮到已經通過Window的datacontext對集合進行了某種引用...?

另外,UserControl是這種事情的正確選擇嗎?我應該使用框架還是其他的?

回答

3

我如何到達原始viewmodel動物observablecollection從UserControl的代碼隱藏?

你一般不會這麼做。一般情況下,它通常以結合「命令」這是需要此作爲命令一個較好的方法,因此,邏輯可以保持在視圖模型。 ViewModel應該是將新的Animal實例添加到它自己的集合中。

如果必須出於某種原因做這個,你可以投的數據上下文:

// In code behind: 
Zoo vm = this.DataContext as Zoo; 
if (vm != null) 
{ 
    ObservableCollection<Animal> items = vm.Animals; 
    items.Add(newAnimal); 
} 
+0

謝謝,非常實用! – Andrew

相關問題