Использование пользовательского присоединенного свойства с привязкой - PullRequest
2 голосов
/ 18 июня 2011

Я смотрел на этот вопрос , но я не понимаю, как на самом деле использовать созданный AttachedProperty.Проблема заключается в попытке привязки к источнику элемента управления WebBrowser.

Код выглядит следующим образом:

public static class WebBrowserUtility
{
public static readonly DependencyProperty BindableSourceProperty =
    DependencyProperty.RegisterAttached("BindableSource", typeof(string), typeof(WebBrowserUtility), new UIPropertyMetadata(null, BindableSourcePropertyChanged));

public static string GetBindableSource(DependencyObject obj)
{
    return (string) obj.GetValue(BindableSourceProperty);
}

public static void SetBindableSource(DependencyObject obj, string value)
{
    obj.SetValue(BindableSourceProperty, value);
}

public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
    WebBrowser browser = o as WebBrowser;
    if (browser != null)
    {
            string uri = e.NewValue as string;
            browser.Source = uri != null ? new Uri(uri) : null;
    }
}
}

и

<WebBrowser ns:WebBrowserUtility.BindableSource="{Binding WebAddress}"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
            ScrollViewer.VerticalScrollBarVisibility="Disabled" 
            Width="300"
            Height="200" />

Адрес WebAddress,что это такое?Это мое понимание (что, вероятно, неправильно):

  • Существует AttachedProperty, который может быть присоединен к любому объекту, и в этом конкретном случае, это в основном просто присоединение свойства с именем BindableSource, которое имеет типString.
  • Когда у нас есть "{Binding WebAddress}", это означает, что в некотором коде c # где-то, который обрабатывает этот файл .xaml, есть что-то похожее на:

    public String WebAddress
    { 
        // get and set here? not sure
    }
    
  • И чтобы воспользоваться измененным свойством, я могу вызвать RaisedPropertyChanged, и он запустит этот статический метод там?

Даже когда я смотрю на это, оно кажется неправильным, ноЯ не могу найти в Интернете ничего, чтобы помочь мне.

1 Ответ

2 голосов
/ 18 июня 2011

Существует AttachedProperty, который можно прикрепить к любому объекту, и в данном конкретном случае это просто присоединение свойства с именем BindableSource типа String.

Возможно, вы захотитепрочитать статью MSDN о вложенных свойствах .

Это довольно просто: Свойства зависимостей работают со словарями, в которых элементы управления связаны со своими значениями для свойства, этоделает довольно простым добавление чего-то подобного присоединенным свойствам, которые могут расширять элемент управления.

В методе RegisterAttached присоединенного свойства подключается PropertyChangedCallback, который будет выполнен, если значение изменится.Использование свойства зависимости позволяет связать, что является точкой с самого начала.Все, что действительно делает свойство, это вызывает соответствующий код для навигации по браузеру, если значение изменяется.


Когда у нас есть "{Binding WebAddress}", это означает, что в некотором коде c # где-тообрабатывает этот файл .xaml, что-то похожее на [...]

Привязка ссылается на некоторое общедоступное свойство или свойство зависимостей ( не a поле ) называется WebAddress внутри DataContext веб-браузера.Для получения общей информации о привязке данных см. Обзор привязки данных .

Поэтому, если вы хотите создать свойство, которое должно быть источником привязки, вы либо реализуете INotifyPropertyChanged или вы создаете DependencyProperty (они запускают уведомления об изменениях самостоятельно, и вы обычно создаете их только для элементов управления и классов, связанных с пользовательским интерфейсом)

Ваше свойство может выглядеть следующим образом:

public class MyModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private string _webAddress;
    public string WebAddress
    {
        get { return _webAddress; }
        set
        {
            if (value != _webAddress)
            {
                _webAddress = value;
                NotifyPropertyChanged("WebAddress");
            }
        }
    }
}

Здесь вы должны вызвать событие PropertyChanged в установщике, как вы и предполагали.Как на самом деле объявить рабочие привязки в XAML - довольно широкая тема, и я хотел бы еще раз направить вас к вышеупомянутому Обзор привязки данных , который должен это объяснить.


И чтобы воспользоваться измененным свойством, я могу вызвать RaisedPropertyChanged, и он вызовет этот статический метод там?

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

...