1. ホーム
  2. c#

[解決済み] WPFでWebBrowserのSourceプロパティをdatabindする

2023-03-24 14:26:35

質問

WPF ( 3.5SP1 ) でWebBrowserの.Sourceプロパティをデータバインドする方法をご存知の方はいらっしゃいますか? 私は、左側に小さなWebBrowser、右側にコンテンツを持ち、リストアイテムにバインドされた各オブジェクトのURIで各WebBrowserのソースをデータバインドしたいリストビューがあります。

これは今のところ概念実証として持っているものですが、" <WebBrowser Source="{Binding Path=WebAddress}" "はコンパイルされません。

<DataTemplate x:Key="dealerLocatorLayout" DataType="DealerLocatorAddress">                
    <StackPanel Orientation="Horizontal">
         <!--Web Control Here-->
        <WebBrowser Source="{Binding Path=WebAddress}"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
            ScrollViewer.VerticalScrollBarVisibility="Disabled" 
            Width="300"
            Height="200"
            />
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Path=CompanyName}" FontWeight="Bold" Foreground="Blue" />
                <TextBox Text="{Binding Path=DisplayName}" FontWeight="Bold" />
            </StackPanel>
            <TextBox Text="{Binding Path=Street[0]}" />
            <TextBox Text="{Binding Path=Street[1]}" />
            <TextBox Text="{Binding Path=PhoneNumber}"/>
            <TextBox Text="{Binding Path=FaxNumber}"/>
            <TextBox Text="{Binding Path=Email}"/>
            <TextBox Text="{Binding Path=WebAddress}"/>
        </StackPanel>
    </StackPanel>
</DataTemplate>

どのように解決するのですか?

問題は WebBrowser.Source 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}"/>