【问题标题】:wpf TabItem binding IsEnabledwpf TabItem 绑定 IsEnabled
【发布时间】:2013-08-04 00:46:24
【问题描述】:

我想将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 事件为 null,因此不会发送通知事件。

提前致谢。

【问题讨论】:

  • 不知道是不是问题,但我不会在InializeComponent()之前编写任何类型的 UI 代码
  • 也尝试将 Mode="TwoWay" 添加到绑定中
  • m_myData 和 m_bindingData 是两个不同的变量。是错字吗?
  • 我尝试在 InitializeComponent() 之后设置数据上下文,将模式设置为 TwoWay 但没有区别。另外,是的,这是一种类型。
  • 您的代码没有理由不工作。我已经根据您的代码制作了一个程序,它可以完美运行。我的预感是您正在运行时动态地将数据上下文更改为其他内容,或者您​​正在做一些您没有告诉我们的巫术魔术。

标签: wpf binding inotifypropertychanged tabitem isenabled


【解决方案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>

【讨论】:

    【解决方案2】:

    这个呢?注意 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");
            }
        }            
    }
    

    【讨论】:

      【解决方案3】:

      您的TabItem 可能不会继承您的Window 的DataContext。尝试查看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}"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 2013-08-05
        相关资源
        最近更新 更多