wpf привязка TabItem IsEnabled

Я хотел бы связать 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 имеет значение null, поэтому событие уведомления не отправляется.

Заранее спасибо.

3 ответа

Решение

Я предполагаю, что вам нужно изменить 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>

Ваш TabItem может не наследовать DataContext вашей Window, Попробуйте заглянуть в output window, binding failure error Будет здесь.

В качестве обходного пути вы можете использовать RelativeSource путешествовать до DataContext вашего окна и связать с соответствующим свойством, как это -

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

Как насчет этого? Обратите внимание на 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");
        }
    }            
}
Другие вопросы по тегам