ডাব্লুপিএফ-এ ওয়েব ব্রাউজারের উত্স সম্পত্তিটি ডেটাবাইন্ড করুন


86

ডাব্লুপিএফ (3.5SP1) ওয়েব ব্রাউজারের সোর্স সম্পত্তিটি কীভাবে ডেটাবাইন্ড করতে হয় কেউ জানেন? আমার একটি তালিকাদর্শন আছে যা আমি বামদিকে একটি ছোট ওয়েব ব্রাউজার এবং ডানদিকে সামগ্রী রাখতে চাইছি এবং তালিকা আইটেমের সাথে আবদ্ধ প্রতিটি বস্তুর ইউআরআই সহ প্রতিটি ওয়েব ব্রাউজারের উত্সটি ডেটাবাইন্ড করতে চাই।

এখনও পর্যন্ত ধারণার প্রমাণ হিসাবে আমার কাছে এটিই রয়েছে তবে " <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>

উত্তর:


158

সমস্যাটি হ'ল WebBrowser.Sourceএকটি নয় DependencyPropertyAttachedPropertyএই ক্ষমতা সক্ষম করতে কিছু জাদু ব্যবহার করা এক কাজ ।

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;
        }
    }

}

তারপরে আপনার এক্সামে করুন:

<WebBrowser ns:WebBrowserUtility.BindableSource="{Binding WebAddress}"/>

9
"নতুন উরি (ইউরি)" তে স্ট্রিংটি "" হিসাবে ব্যতিক্রম পাচ্ছেন। সম্ভবত এটি হওয়া উচিত .... ব্রাউজার.সোর্স = স্ট্রিং।আইএসএনওলআরএম্পটি (ইউরি)? নাল: নতুন উরি (ইউরি);
মিডস্পেস 23

4
নোট করুন যে এটি কেবলমাত্র এক উপায় বাঁধাই এবং ওয়েব ব্রাউজার পৃষ্ঠা পরিবর্তিত হলে বিনডেবল উত্স সম্পত্তি পরিবর্তন হবে না।
কুড়েন

4
নবাগত হিসাবে এটি অনুসরণ করা আমার পক্ষে কিছুটা কঠিন ছিল - সম্পত্তির পরিবর্তিত আপডেটের ইভেন্টের সাথে সীমাবদ্ধ ভিউমোডেলে "ওয়েবএড্রেস" -এর জন্য একটি বেসরকারী-পাবলিক গেটার সেটার থাকার বিষয়ে কিছু লিখতে সহায়তা করত। এই প্রকল্পের একটি একই উদাহরণ রয়েছে। github.com/thoemmi/WebBrowserHelper
pgee70

ধন্যবাদ আমি এটি নিয়েছি এবং এটি একটি "এইচটিএমএল" সম্পত্তি বাস্তবায়নের জন্য এটি সংশোধন করেছি, এটি হুডের নীচে নেভিগেটটোস্ট্রিং বলে।
অ্যান্টনি স্কট

@ pgee70 ধন্যবাদ, আমি কি তোমার GitHub উদাহরণ অনুসরণ এবং একটি আচরণ কাজ করে
percentum

33

বাঁধার উত্স থেকে স্ট্রিং বা ইউরিসকে কপি করে এমন একটি সংস্করণ তৈরি করতে আমি টডের দুর্দান্ত উত্তরে কিছুটা সংশোধন করেছি:

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

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

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

    public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        WebBrowser browser = o as WebBrowser;
        if (browser == null) return;

        Uri uri = null;

        if (e.NewValue is string )
        {
            var uriString = e.NewValue as string;
            uri = string.IsNullOrWhiteSpace(uriString) ? null : new Uri(uriString);
        }
        else if (e.NewValue is Uri)
        {
            uri = e.NewValue as Uri;
        }

        browser.Source = uri;
    }

31

আমি একটি মোড়ক ব্যবহারকারী নিয়ন্ত্রণটি লিখেছি, যা নির্ভরতাপ্রাপ্তি ব্যবহার করে:

এক্সএএমএল:

<UserControl x:Class="HtmlBox">
    <WebBrowser x:Name="browser" />
</UserControl>

সি #:

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}"  />

এটির সাথে একমাত্র সমস্যাটি হ'ল ওয়েব ব্রাউজার নিয়ন্ত্রণ "খাঁটি" ডাব্লুপিএফ নয় ... এটি আসলে উইন 32 উপাদানগুলির জন্য কেবল একটি মোড়ক। এর অর্থ হ'ল নিয়ন্ত্রণটি জেড-সূচককে সম্মান করবে না এবং সর্বদা অন্যান্য উপাদানকে ওভারলে করবে (যেমন: কোনও স্ক্রোলভিউয়ারে এটি কিছুটা সমস্যা দেখা দিতে পারে) এমএসডিএন -এ এই win32-wpf ইস্যু সম্পর্কে আরও তথ্য


আমি আমার নিজের এইচটিএমএল প্রদর্শন করতে চাইলে ঠিক এটিই আমার প্রয়োজন ছিল। ঝরঝরে, সরল এবং আমি এটি প্রায় কী তা বুঝতে পারি (-:
মার্ফ

3

দুর্দান্ত ধারণা টড।

আমি এখন সিলভারলাইট 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-Code।

<RichTextBox IsReadOnly='False' TextWrapping='Wrap' utilities:RichTextBoxHelper.BindableSelectionText="{Binding Content}"/>


0

কিছু বেসিক লজিক প্রাঙ্গনে সুবিধা গ্রহণের পাশাপাশি নাল কোয়েলসিং অপারেটরটি ব্যবহার করার জন্য এটি টড এবং শমূয়েলের জবাবের পরিমার্জন

public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
    WebBrowser browser = o as WebBrowser;

    if ((browser != null) && (e.NewValue != null))
        browser.Source = e.NewValue as Uri ?? new Uri((string)e.NewValue);

}
  1. যদি ব্রাউজারটি নাল হয় বা অবস্থানটি শূন্য হয়, আমরা কোনও নাল পৃষ্ঠায় ব্যবহার করতে বা নেভিগেট করতে পারি না।
  2. # 1-এ থাকা আইটেমগুলি যখন নাল নয় তখন নির্ধারণের সময়, যদি নতুন মানটি ইউআরআই হয় তবে এটি ব্যবহার করুন। যদি না হয় এবং ইউআরআই নাল হয়, তবে এটির জন্য একত্রিত হওয়া উচিত একটি স্ট্রিং যা ইউআরআইতে রাখা যেতে পারে; যেহেতু # 1 বল প্রয়োগ করে যে স্ট্রিংটি নাল হতে পারে না।

-3

xamlক্লাস ফাইলটির দিকে ইঙ্গিত করা ফাইলের প্রথম কয়েকটি লাইনে আপনাকে এটি ঘোষণা করতে হবে

xmlns:reportViewer="clr-namespace:CoMS.Modules.Report" 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.