6

数据绑定到控件的可见属性时是否存在任何已知问题?

无论我的属性是什么,该控件始终不可见。

Public ReadOnly Property IsRibbonCategory() As Boolean
    Get
        Return True
    End Get
End Property

我尝试了控件的文本属性和其他属性,它们似乎工作正常。

我正在尝试设置面板的可见属性。

4

6 回答 6

8

我发现如果你假设绑定到控件的 Visible 属性被破坏,尽管它有时会起作用,但生活会更好。请参阅http://support.microsoft.com/kb/327305,其中说了很多(虽然知识库文章适用于 .NET 1.0 和 1.1,但至少在 2.0 中似乎仍然是一个问题)。

我创建了一个用于创建绑定的实用程序类,除其他外,它为我提供了一个集中的位置来添加解决方法。它没有在 Visible 上实际创建绑定,而是做了两件事:

  1. 它订阅数据源的 INotifyPropertyChanged.PropertyChanged 事件,并在引发事件时根据需要设置 Visible 值。
  2. 它根据当前数据源值设置 Visible 的初始值。

这需要一点反射代码,但还不错。关键是不要绑定 Visible 属性执行解决方法,否则它将不起作用。

于 2010-05-06T21:56:01.460 回答
4

解决方法:设置 BindingComplete 事件的 Visible 属性。

我在设置标签的 Visible 属性时遇到了同样的问题 - 始终保持为 false,即使设置 Enabled 属性工作正常。

于 2009-07-30T01:46:34.090 回答
2

我刚刚在 .NET 4.7.1 和 Visual Studio 2017 中遇到了这个问题。为了解决这个问题,我将Visible控件上的属性更改为最初设置为True,就像我False以前一样。

于 2019-01-07T23:56:53.183 回答
1

检查事项:

  • 确保您已实例化具有 IsRibbonCategory 属性的类
  • 您是否将绑定源的属性的数据源设置为类的实例
  • 数据源更新模式应为“验证时”
  • 确保您没有在控件上手动将可见属性设置为 false

希望有帮助。您可以发布更多代码吗?

于 2009-04-09T13:48:20.363 回答
0

一种解决方法是使用组件将数据绑定到控件的可见性属性,而不是直接绑定到控件的可见性属性。见下面的代码:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
  public class ControlVisibilityBinding : Component
  {
    private static readonly object EventControlChanged = new object();
    private static readonly object EventVisibleChanged = new object();

    private System.Windows.Forms.Control _control;
    private bool _visible = true;

    public event EventHandler VisibleChanged
    {
        add { Events.AddHandler(EventVisibleChanged, value); }
        remove { Events.RemoveHandler(EventVisibleChanged, value); }
    }

    public event EventHandler ControlChanged
    {
        add { Events.AddHandler(EventControlChanged, value); }
        remove { Events.RemoveHandler(EventControlChanged, value); }
    }

    public ControlVisibilityBinding()
    {
    }

    public ControlVisibilityBinding(IContainer container)
    {
        container.Add(this);
    }

    [DefaultValue(null)]
    public System.Windows.Forms.Control Control
    {
        get { return _control; }
        set
        {
            if(_control == value)
            {
                return;
            }
            WireControl(_control, false);
            _control = value;
            if(_control != null)
            {
                _control.Visible = _visible;
            }
            WireControl(_control, true);
            OnControlChanged(EventArgs.Empty);
            OnVisibleChanged(EventArgs.Empty);
        }
    }

    [DefaultValue(true)]
    public bool Visible
    {
        get { return _visible; }
        set
        {
            if(_visible != value)
            {
                _visible = value;
            }
            if(Control != null)
            {
                Control.Visible = _visible;
            }
            OnVisibleChanged(EventArgs.Empty);
        }
    }

    private void WireControl(Control control, bool subscribe)
    {
        if(control == null)
        {
            return;
        }
        if(subscribe)
        {
            control.VisibleChanged += Control_VisibleChanged;
        }
        else
        {
            control.VisibleChanged -= Control_VisibleChanged;
        }
    }

    private void Control_VisibleChanged(object sender, EventArgs e)
    {
        OnVisibleChanged(EventArgs.Empty);
    }

    protected virtual void OnVisibleChanged(EventArgs e)
    {
        EventHandler subscribers = (EventHandler)Events[EventVisibleChanged];
        if(subscribers != null)
        {
            subscribers(this, e);
        }
    }

    protected virtual void OnControlChanged(EventArgs e)
    {
        EventHandler subscribers = (EventHandler)Events[EventControlChanged];
        if(subscribers != null)
        {
            subscribers(this, e);
        }
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        using(Form form = new Form())
        using(FlowLayoutPanel groupBoxLayoutPanel = new FlowLayoutPanel())
        using(RadioButton visibleButton = new RadioButton())
        using(RadioButton hiddenButton = new RadioButton())
        using(GroupBox groupBox = new GroupBox())
        using(Label text = new Label())
        using(ControlVisibilityBinding visibilityBinding = new ControlVisibilityBinding())
        using(TextBox inputTextBox = new TextBox())
        {
            groupBoxLayoutPanel.Dock = DockStyle.Fill;
            groupBoxLayoutPanel.FlowDirection = FlowDirection.LeftToRight;
            groupBoxLayoutPanel.AutoSize = true;
            groupBoxLayoutPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;

            visibleButton.Text = "Show Label";
            visibleButton.AutoSize = true;
            hiddenButton.Text = "Hide Label";
            hiddenButton.AutoSize = true;
            groupBoxLayoutPanel.Controls.Add(visibleButton);
            groupBoxLayoutPanel.Controls.Add(hiddenButton);

            inputTextBox.Text = "Enter Label Text Here";
            inputTextBox.Dock = DockStyle.Top;

            groupBox.AutoSize = true;
            groupBox.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            groupBox.Controls.Add(groupBoxLayoutPanel);
            groupBox.Dock = DockStyle.Fill;

            text.AutoSize = true;
            text.ForeColor = Color.Red;
            text.Dock = DockStyle.Bottom;
            text.BorderStyle = BorderStyle.FixedSingle;
            text.Font = new Font(text.Font.FontFamily, text.Font.Size * 1.25f, FontStyle.Bold | FontStyle.Italic);
            text.DataBindings.Add("Text", inputTextBox, "Text", true, DataSourceUpdateMode.Never);

            visibilityBinding.Control = text;
            visibleButton.DataBindings.Add("Checked", visibilityBinding, "Visible", true, DataSourceUpdateMode.OnPropertyChanged);
            Binding binding = hiddenButton.DataBindings.Add("Checked", visibilityBinding, "Visible", true, DataSourceUpdateMode.OnPropertyChanged);
            ConvertEventHandler invertConverter = (sender, e) => e.Value = !((bool)e.Value);
            binding.Format += invertConverter;
            binding.Parse += invertConverter;

            form.Controls.Add(inputTextBox);
            form.Controls.Add(text);
            form.Controls.Add(groupBox);
            Application.Run(form);
        }
    }
}

}

于 2011-06-01T15:28:20.417 回答
0

这是我的转身,它可能很愚蠢,但它工作了很多次。

我在我的表单中放了一个面板控件,我让它填写我的表单,然后我把所有东西都放在那个面板中。我绑定Visible属性的所有控件都会根据我的 DataGridView 中的对象看到它们的可见性变化。

表格结构

于 2019-06-16T13:50:20.723 回答