Прикрепленное свойство для привязки к WebBrowser не работает - PullRequest
0 голосов
/ 03 сентября 2018

Я искал способ получить HTML из элемента управления WPF WebBrowser. Два наилучших варианта, которые я нашел, - это привязать прикрепленное к клиенту свойство к свойству приложения или создать новый элемент управления из элемента управления WebBrowser. Учитывая мой уровень знаний и тот факт, что (на данный момент мне действительно нужен только один раз) я выбрал первый. Я даже подумывал о том, чтобы нарушить стиль MVVM и использовать код-позади, но решил не сдаваться в привязке.

Я нашел несколько примеров создания присоединенного свойства, наконец выбрал это, отсюда Здесь :

namespace CumminsInvoiceTool.HelperClasses
{
    public static class WebBrowserExtentions
    {
        public static readonly DependencyProperty DocumentProperty =
            DependencyProperty.RegisterAttached("Document", typeof(string), typeof(WebBrowserExtentions), new UIPropertyMetadata(null, DocumentPropertyChanged));

        public static string GetDocument(DependencyObject element)
        {
            return (string)element.GetValue(DocumentProperty);
        }

        public static void SetDocument(DependencyObject element, string value)
        {
            element.SetValue(DocumentProperty, value);
        }

        public static void DocumentPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
            WebBrowser browser = target as WebBrowser;
            if (browser != null)
            {
                string document = e.NewValue as string;
                browser.NavigateToString(document);
            }
        }
    }
}

Я также добавил следующее в xaml для элемента управления WebBrowser (я пробовал как с, так и без «Path =» в xaml:

<WebBrowser local:WebBrowserExtentions.Document="{Binding Path=PageCode}" Source="https://www.cummins-distributors.com/"/>

My View имеет элемент управления вкладками, одна вкладка имеет элемент управления WebBrowser, а другая вкладка имеет текстовое поле. Когда я нажимаю код получения, viewModel запускает функцию, чтобы установить свойство, привязанное к текстовому полю, к строке, к которой привязано присоединенное свойство WebBrowser. Ниже приведен код моей ViewModel.

namespace CumminsInvoiceTool.ViewModels
{
    class ShellViewModel : Screen
    {

        private string _browserContent;

        public string BrowserContent
        {
            get { return _browserContent; }
            set {
                _browserContent = value;
                NotifyOfPropertyChange(() => BrowserContent);
            }
        }

        private string _pageCode;

        public string PageCode
        {
            get { return _pageCode; }
            set {
                _pageCode = value;
                NotifyOfPropertyChange(() => PageCode);
            }
        }


        public void StartProgressCommand()
        {

        }

        public void GetContent()
        {
            if (!string.IsNullOrEmpty(PageCode))
            {
                BrowserContent = PageCode;
            }
            else
            {
                MessageBox.Show("There is no cintent to show", "No content Error", MessageBoxButton.OK);

            }
        }

    }
}

Приложение компилируется и запускается, но когда я нажимаю «Получить код», я получаю окно сообщения для «Код страницы» пусто.

Когда я устанавливаю точку останова в начале функции для кнопки, строка PageCode показывает «ноль».

Это проблема, потому что я использую Caliburn.Micro или мне не хватает чего-то еще?

------- РЕДАКТИРОВАТЬ для комментариев ----------

Кнопка вызывает GetContent () в приведенном выше коде «ShellViewModel». Я знаю, что кнопка связана и работает, потому что приложение показывает настраиваемое окно сообщений, которое я настроил, чтобы сообщить мне, когда "pageCode" равен нулю или пуст.

Текстовое поле выглядит так:

<TextBox x:Name="BrowserContent"/>
...