Вопрос

Конструкция XAML {Binding} очень удобна, поскольку она автоматически обрабатывает все проблемы с ограниченными возможностями. Это действительно впечатляет, когда вы передаете его путь к объекту, через .NET Data Structures, и все автоматически обновляется для вас.

Я хотел бы использовать то же самое в C #. Я хотел бы иметь свойство, которая получена из ценности другого имущества. Пример

class Foo
{
    public Bar Bar = new Bar();
    public string ItGetter
    {
        get
        {
            return Bar.Baz.It;
        }
    }
}

class Bar
{
    public Baz Baz = new Baz();
}

class Baz
{
    public string It { get { return "You got It!"; } }
}

Если вы называете ITGetter на FO, вы получаете его значение из BAZ. Это работает нормально, за исключением того, что он не является недействительным - то есть, если он изменился, не будет изменений уведомлений о ITGETTER. Кроме того, если FOO.BAR или BAR.BAZ ссылки изменяются, вы также не получите изменения нефикирования.

Я могу добавить соответствующий код iChangenotify в свойствах, но мой вопрос: как я могу кодировать свойство ITGetter так, чтобы он позвонит своему недвижимому событию, когда любая из ссылок на пути, или изменение значения IT? Я надеюсь, что мне не нужно вручную настроить свойство измененных событий на все элементы на пути ....

Спасибо за любую помощь!

Эрик

Это было полезно?

Решение

Вы можете взглянуть на Свойства зависимости. Отказ Они позволяют определить свойства в системе свойств WPF, которые поддерживаются стеками метаданных и подробной системой разрешения значения.

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

Есть некоторые другие хорошие артцильные, такие как «Демистифицирующая зависимость Свойства» Джош Смита а также «Свойства зависимости» христианскими моюлью

Вы также можете прочитать Зависимость недвижимости обратных вызовов и проверки

Другие советы

Вот полный код, который занимается тем, что я искал, используя свойства зависимости, как упомянул Саймон:

// This class exists to encapsulate the INotifyPropertyChanged requirements
public class ChangeNotifyBase : DependencyObject, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
}

public class Foo : ChangeNotifyBase
{
    public Foo()
    {
        Bar = new Bar();
        var binding = new Binding("Bar.Baz.It");
        binding.Source = this;
        binding.Mode = BindingMode.TwoWay;
        BindingOperations.SetBinding(this, ItGetterProperty, binding);
    }

    /// <summary>
    /// The ItGetter dependency property.
    /// </summary>
    public bool ItGetter
    {
        get { return (bool)GetValue(ItGetterProperty); }
        set { SetValue(ItGetterProperty, value); }
    }
    public static readonly DependencyProperty ItGetterProperty =
        DependencyProperty.Register("ItGetter", typeof(bool), typeof(Foo));

    // Must do the OnPropertyChanged to notify the dependency machinery of changes.
    private Bar _bar;
    public Bar Bar { get { return _bar; } set { _bar = value; OnPropertyChanged("Bar"); } }
}

public class Bar : ChangeNotifyBase
{
    public Bar()
    {
        Baz = new Baz();
    }
    private Baz _baz;
    public Baz Baz { get { return _baz; } set { _baz = value; OnPropertyChanged("Baz"); } }
}

public class Baz : ChangeNotifyBase
{
    private bool _it;
    public bool It { get { return _it; } set { _it = value; OnPropertyChanged("It"); } }
}

Если вы сейчас зарегистрируетесь на мероприятиях на ITGetter, вы получите уведомление, если какое-либо из этих вещей изменяется: baz.it foo.bar (т. Е. Изменить ссылку) bar.baz ""

Если вы устанавливаете на ссылки на объекты (Foo.bar или bar.baz) в null, значение iTgetter меняется в false.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top