0

我想将 的IsEnabled属性绑定TabItem到我的代码中的数据。

例如,我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 事件为空,因此不会发送通知事件。

提前致谢。

4

3 回答 3

1

TabItem可能不会继承DataContext您的Window. 试着调查一下output windowbinding failure error会在那里。

作为一种解决方法,您可以使用RelativeSource它移动到DataContext您的窗口并与它的相关属性绑定,如下所示 -

<TabItem Name="Tab1" Header="Tab1"
         IsEnabled="{Binding Path=DataContext.Tab1Enabled,
                            RelativeSource={RelativeSource Mode=FindAncestor,
                                   AncestorType=Window}, Mode=TwoWay}"/>
于 2013-08-02T19:39:17.050 回答
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>
于 2013-08-02T17:30:26.597 回答
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");
        }
    }            
}
于 2013-08-02T18:29:11.527 回答