2013-03-27 66 views
2

設置:我有一個0,...,N標籤一個TabControl,每個選項卡被綁定到一個類:在它的設置WPF TabControl標題和內容沒有更新?

class MyTabItem 
{ 
    string Text {get; set;} 
    int ID {get; set;} 
    ISet<MyTabContent> Contents {get; set;} 
} 

Class MyTabContent 
{ 
    int ID {get; set;} 
    string Subtext {get; set;} 
} 

每個TabItem的類有許多tabcontent類。 (整個事情通過NHibernate獲取)。

我已經嘗試了很多東西來將MyTabItem的內容綁定到每個tabcontrol項目的標題,並將MyTabContent的內容綁定到每個tabcontrol項目的內容中的datagrid。

我可以顯示選項卡中的所有內容,但每當更改綁定類中的屬性時,UI都不會更新。我試圖調用InvalidateVisual,試圖調度一個渲染事件,試圖在綁定上的UpdateTarget和UpdateSource(最後2個拋出異常)。我在我的viewmodel中實現了INotifyPropertyChanged,甚至嘗試手動使用OnPropertyChanged(「MyTabItem」)無濟於事。

我真的不明白爲什麼我的tabcontrol內容不會更新,當我改變綁定類的屬性。我已經嘗試了2種不同的綁定策略,既可以用於顯示內容,也可以在內容更改時更新。

我的XAML的設置是:

<TabControl> 
    <TabControl.ItemTemplate> 
    <DataTemplate DataType="models:MyTabItem"> 
     <TextBlock Text="{Binding Text}" /> 
    </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
    <DataTemplate DataType="models:MyTabItem"> 
     <DataGrid ItemsSource="{Binding Contents}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=Subtext}" /> 
     </DataGrid.Columns> 
     </DataGrid> 
    </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

隨着該XAML的設置,我只是簡單地添加的內容與tabcontrol.Items.Add(新MyTabItem)中的tabcontrol。

然後我嘗試了另一個XAML設置,我將tabcontrol.Itemsource綁定到代碼隱藏中的ObservableCollection。同樣,標籤內容沒有更新,如果綁定屬性改變:(

我也試過在視圖模型製作CURRENTITEM屬性,使用,作爲一個Window.Resource,然後綁定的自定義的Tabcontrol內容

{Binding Source={StaticResource CurrentItem}, Path=Text} 

每當我改變了我的標籤將更新的視圖模型的CURRENTITEM,但它也沒有更新的變化。

我非常的想法:(

+1

那是你的ViewModels的實際代碼? WPF不支持綁定到'Fields',只有'properties'。 – 2013-03-27 17:58:47

+1

它們是我viewmodel中的屬性,我忘記了將setter和getters插入到我的僞代碼中。在問題中更新它。 – 2013-03-27 18:08:52

回答

4

您需要實現INotifyPropertyChanged

請記住有一個在.NET 4.5的新屬性,它簡化了任務,看看here

這裏有一個樣品,應用到這兩個類,該列表將需要成爲ObservableCollection

private ObservableCollection<MyTabContent> _contents = new ObservableCollection<MyTabContent>(); 
public ObservableCollection<MyTabContent> Contents { get { return _contents; } } 

-

public class MyTabContent : INotifyPropertyChanged 
{ 
    private int _id; 
    int ID { 
     get{ return _id; } 
     set{ _id = value; OnPropertyChanged(); } 
    } 

    private string _subText; 
    public string Subtext { 
     get{ return _subText; } 
     set{ _subText= value; OnPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     if (PropertyChanged!= null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+2

我需要在哪裏實施?我的viewmodel已經實現了它,我試圖將tabcontrol的itemssource設置爲一個已經實現INotifyPropertyChanged的ObserveableCollection <>嗎?我是否必須在綁定類本身中實現它?並且我將如何實現這一點,例如當一個項目被添加到第一個類中的ISet時? 我正在使用.net 4.0,因此我無法使用該新屬性。 – 2013-03-27 18:28:01

+0

@AetherMcLoud看到編輯,記得標記爲答案,如果它工作 – 2013-03-27 18:38:12

+1

謝謝,我明天早上試試。希望這些setter和getter不會干擾類的NHibernate映射。我不知道NHibernate是否可以使用ObserveableCollection而不是ISet。 – 2013-03-27 18:39:27