2011-06-17 194 views
2

我在看this question,但我不明白如何實際使用創建的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類型。
  • 當我們擁有了「{結合WebAddress}」這意味着,在一些C#代碼的地方,處理此的.xaml文件裏面的東西,看起來像:

    public String WebAddress 
    { 
        // get and set here? not sure 
    } 
    
  • 和屬性改爲利用,我可以調用RaisedPropertyChanged,它會在那裏觸發靜態方法?

即使我看着它,它似乎並不正確,但我無法找到任何在線幫助我。

回答

2

有一個AttachedProperty可以附加到任何對象,在這個特殊情況下,它基本上只是附加一個名爲BindableSource的String類型的屬性。

您可能想要閱讀MSDN article on attached properties

它很簡單:Dependency properties使用字典中的控件與屬性的值相關聯,這使得添加可以擴展控件的附加屬性非常容易。

在附加屬性的RegisterAttached方法中,掛接了一個PropertyChangedCallback,如果該值發生更改,將執行該方法。使用依賴屬性啓用綁定,這是首先完成此操作的要點。如果值改變,所有屬性都會調用相關的代碼來瀏覽瀏覽器。


當我們有 「{結合WebAddress}」 這意味着,在一些C#代碼的地方,處理此文件名爲.xaml裏面的東西,看起來像[...]

的綁定引用一些公開的property或依賴屬性(而不是 a field)在Web瀏覽器的DataContext內調用WebAddress。有關數據綁定的一般信息,請參閱Data Binding Overview

所以,如果你想創建一個屬性,它應該是一個綁定源,你可以實現INotifyPropertyChanged,或者你創建一個DependencyProperty(它們自己觸發更改通知,並且通常只在控件和UI相關的類上創建)

你的屬性看起來是這樣的:

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中實際聲明工作綁定是一個相當廣泛的主題,我想引導您再次參考前面提到的Data Binding Overview,這應該解釋這一點。


,並利用更改的屬性,我可以叫RaisedPropertyChanged,它就會觸發靜態方法在那裏?

該事件被觸發來觸發的結合來更新,這又改變了附加屬性這反過來將導致執行最終導航瀏覽器中的PropertyChangedCallback的值。

+1

實際上,OP可能*不希望在實現WebAddress屬性的ViewModel類中引發PropertyChanged事件 – cordialgerm

+0

@pickles:嗯,這聽起來很合理。 –

+0

@pickles:我明顯更新了我的答案,希望能夠解決所有問題。 –