привязка usercontrol к противоположности свойства bool - PullRequest
15 голосов
/ 17 марта 2010

Довольно просто: я собираюсь сделать то же самое, что и this , но в winforms. Все, что Google, кажется, подтягивает, специфично для wpf (т.е. я не хочу ссылаться на presentationframework.dll)

Объясняется, если вы не хотите читать ссылку:

Ниже приведено представление о том, что я хотел бы сделать, хотя это, очевидно, не работает.

CheckBox1.DataBindings.Add(new Binding("Checked", this.object, "!SomeBool"));

Ответы [ 3 ]

22 голосов
/ 17 марта 2010

У вас есть два варианта:

  1. Создайте объект Binding вручную и присоедините к событиям Format и Parse и поменяйте местами значения в каждом.
  2. Создайте дополнительное свойство в классе, которое просто меняет логику намеченного свойства

Первый вариант более чистый, IMO, поскольку он не заставляет API вашего класса следовать дизайну вашего пользовательского интерфейса, хотя второй вариант (незначительно) проще.

Пример варианта 1

private void SwitchBool(object sender, ConvertEventArgs e)
{ 
    e.Value = !((bool)e.Value);
}

...

Binding bind = new Binding("Checked", this.object, "SomeBool");

bind.Format += SwitchBool;
bind.Parse += SwitchBool;

CheckBox1.DataBindings.Add(bind);

Пример варианта 2

public class SomeClass
{
    public bool SomeBool { get; set; }

    public bool NotSomeBool
    {
        get { return !SomeBool; }
        set { SomeBool = !value; }
    }
}

...

CheckBox1.DataBindings.Add("Checked", this.object, "NotSomeBool");

Опять же, я очень одобряю вариант 1, так как вариант 2 требует, чтобы вы адаптировали свой класс к дизайну вашего интерфейса.

9 голосов
/ 01 ноября 2013

На основании ответа Адама я написал небольшой вспомогательный класс:

class NegateBinding
{
    string propertyName;
    object dataSource;
    string dataMember;
    public NegateBinding(string propertyName, object dataSource, string dataMember)
    {
        this.propertyName = propertyName;
        this.dataSource = dataSource;
        this.dataMember = dataMember;
    }

    public static implicit operator Binding(NegateBinding eb)
    {
        var binding = new Binding(eb.propertyName, eb.dataSource, eb.dataMember, false, DataSourceUpdateMode.OnPropertyChanged);
        binding.Parse += new ConvertEventHandler(negate);
        binding.Format += new ConvertEventHandler(negate);
        return binding;
    }

    static void negate(object sender, ConvertEventArgs e)
    {
        e.Value = !((bool)e.Value);
    }
}

Теперь вы можете использовать его так:

label1.DataBindings.Add(new NegateBinding("Visible", otherObject, "HasData"));
1 голос
/ 17 марта 2010

Для этого я бы сделал свойство только для чтения с именем NotSomeBool в том же классе, где у вас есть свойство SomeBool, и вместо этого связал бы это свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...