2013-08-02 57 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}"/>