2013-08-02 96 views
0

我想我的代碼中的TabItem數據的IsEnabled屬性綁定。WPF TabItem的結合的IsEnabled

例如我定義了一個TabItem如下

<TabItem Name="Tab1" Header="Tab1" IsEnabled="{Binding Path=Tab1Enabled, Mode=TwoWay}"> 
</TabItem> 

而且我已經定義了從INotifyPropertyChanged繼承如下

class MyData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
    public bool Tab1Enabled 
    { 
     get{ return m_tab1Enabled; } 
     set 
     { 
      m_tab1Enabled = value; 
      OnPropertyChanged("Tab1Enabled"); 
     } 
    }    
} 

然後我設置DataContext我的數據成員數據類。

public partial class MyApp : Window 
{ 
    MyData m_myData = new MyData(); 
    MyApp() 
    { 
     InitializeComponent(); 
     this.DataContext = m_myData; 
    } 
} 

然而,當Tab1Enabled屬性,都會設置編程,PropertyChanged事件爲空,因此不會發送通知事件。

在此先感謝。

+0

說不上來,如果它的問題,但我不會做任何形式的用戶界面'InializeComponent()'前面的代碼' –

+0

也嘗試在綁定中添加Mode =「TwoWay」 –

+4

'm_myData'和'm_bindingData'是兩個不同的變量。這是一個錯字嗎? – PoweredByOrange

回答

1

即時猜測你需要m_bindinData改爲你要綁定(m_myData)變量。我啓動了VS2012並測試了您的代碼。設置m_myData.Tab1Enabled = true;將選項卡設置爲啓用並且設置m_myData.Tab1Enabled = false;將其禁用正確。下面是我的。

public partial class MyApp : Window 
{ 
    MyData m_myData = new MyData(); 
    MyApp() 
    { 
     this.DataContext = m_myData; 
     InitializeComponent(); 

     m_myData.Tab1Enabled = true; 
    } 
} 

class MyData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
    public bool Tab1Enabled 
    { 
     get { return m_tab1Enabled; } 
     set 
     { 
      m_tab1Enabled = value; 
      OnPropertyChanged("Tab1Enabled"); 
     } 
    } 

    private bool m_tab1Enabled; 
} 

<TabControl> 
    <TabItem Name="Tab1" Header="Tab1" IsEnabled="{Binding Path=Tab1Enabled}"> 
    </TabItem> 
    <TabItem Name="Tab2" Header="Tab2"> 
    </TabItem> 
</TabControl> 
1

這是怎麼回事?注意PropertyChangedEventHandler PropertyChanged = PropertyChanged;在OnPropertyChanged方法中。

class MyData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler PropertyChanged = PropertyChanged; 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
    public bool Tab1Enabled 
    { 
     get{ return m_tab1Enabled; } 
     set 
     { 
      m_tab1Enabled = value; 
      OnPropertyChanged("Tab1Enabled"); 
     } 
    }    
} 
1

TabItem可能沒有繼承你的WindowDataContext。嘗試看看output windowbinding failure error將在那裏。

您也可以使用RelativeSource出行高達你的窗口的DataContext,並用這樣的及其相關屬性綁定解決方法 -

<TabItem Name="Tab1" Header="Tab1" 
     IsEnabled="{Binding Path=DataContext.Tab1Enabled, 
          RelativeSource={RelativeSource Mode=FindAncestor, 
            AncestorType=Window}, Mode=TwoWay}"/>