Проблема - тот WebBrowser. Источником не является DependencyProperty. Одно обходное решение должно было бы использовать некоторое волшебство AttachedProperty включить эту способность.
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 = !String.IsNullOrEmpty(uri) ? new Uri(uri) : null;
}
}
}
Тогда в Вашем xaml сделайте:
<WebBrowser ns:WebBrowserUtility.BindableSource="{Binding WebAddress}"/>
Я написал оболочку usercontrol, которая использует DependencyProperties:
XAML:
<UserControl x:Class="HtmlBox">
<WebBrowser x:Name="browser" />
</UserControl>
C #:
public static readonly DependencyProperty HtmlTextProperty = DependencyProperty.Register("HtmlText", typeof(string), typeof(HtmlBox));
public string HtmlText {
get { return (string)GetValue(HtmlTextProperty); }
set { SetValue(HtmlTextProperty, value); }
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) {
base.OnPropertyChanged(e);
if (e.Property == HtmlTextProperty) {
DoBrowse();
}
}
private void DoBrowse() {
if (!string.IsNullOrEmpty(HtmlText)) {
browser.NavigateToString(HtmlText);
}
}
и использует его так:
<Controls:HtmlBox HtmlText="{Binding MyHtml}" />
Единственная проблема с этим во-первых, элемент управления WebBrowser не является "чистым" wpf ... на самом деле это просто оболочка для компонента win32. Это означает, что элемент управления не будет учитывать z-index и всегда будет перекрывать другой элемент (например: в программе просмотра прокрутки это может вызвать некоторые проблемы) дополнительную информацию об этих проблемах win32-wpf можно найти на MSDN
Классная идея Тодда.
Я проделал то же самое с RichTextBox.Selection.Text в Silverlight 4. Спасибо за ваш пост. Работает отлично.
public class RichTextBoxHelper
{
public static readonly DependencyProperty BindableSelectionTextProperty =
DependencyProperty.RegisterAttached("BindableSelectionText", typeof(string),
typeof(RichTextBoxHelper), new PropertyMetadata(null, BindableSelectionTextPropertyChanged));
public static string GetBindableSelectionText(DependencyObject obj)
{
return (string)obj.GetValue(BindableSelectionTextProperty);
}
public static void SetBindableSelectionText(DependencyObject obj, string value)
{
obj.SetValue(BindableSelectionTextProperty, value);
}
public static void BindableSelectionTextPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
RichTextBox rtb = o as RichTextBox;
if (rtb != null)
{
string text = e.NewValue as string;
if (text != null)
rtb.Selection.Text = text;
}
}
}
Вот Xaml-код.
<RichTextBox IsReadOnly='False' TextWrapping='Wrap' utilities:RichTextBoxHelper.BindableSelectionText="{Binding Content}"/>
Вы также можете использовать специальный отдельный элемент управления прокси . Это применимо не только к случаю WebBrowser, но и к любому подобному элементу управления.