2016-04-30 3 views
1

У меня возникла проблема с моим кодом ниже, где обратный вызов вызывается только в первый раз, когда установлен DocText. Впоследствии установка DocText не вызывает мой обратный вызов. Я пытаюсь сбросить html браузера, установив ту же строку в свойство DocText.Обратный звонок не работает во второй раз

класс WebBrowser

public static readonly DependencyProperty DocumentTextProperty = 
DependencyProperty.Register("DocumentText", typeof(string), 
typeof(WebBrowser), new 
FrameworkPropertyMetadata(string.Empty,TextChangedCallback)); 

private static void TextChangedCallback(DependencyObject 
dependencyObject, DependencyPropertyChangedEventArgs 
dependencyPropertyChangedEventArgs) 
{ 
    var control = (WebBrowser)dependencyObject; 
    control._browser.DocumentText = dependencyPropertyChangedEventArgs.NewValue.ToString(); 
} 

public string DocumentText 
{ 
    get { return (string)GetValue(DocumentTextProperty); } 
    set { SetValue(DocumentTextProperty, value); } 
} 

завод класс, который создает экземпляр веб-браузера с помощью браузеров набор привязки, чтобы связать свойство зависимостей с «DocText»

if (!String.IsNullOrEmpty(documentTextProperty)) 
{ 
    browser.SetBinding(WebBrowser.DocumentTextProperty,  documentTextProperty); 
} 

И documentTextProperyt в настоящее время установленным в соответствии с классом ViewModel

DocText = "some html string"; 

public string DocText 
{ 
    get 
    { 
     _docText = if(html != null? html: string.empty); 
     return _docText; 
    } 
    set 
    { 
     docText = value; 
     OnPropertyChanged(() = DocText); 
    } 
} 

ответ

0

Looks lik e Уведомление не возвращается к управлению (WebBrowser). Проверьте, правильно ли реализована функция INotifyPropertyChanged. Я проверил эквивалентный код в своей системе, и он работает правильно.

public class MaskedTextBox : TextBox 
{ 
    public static readonly DependencyProperty DocumentTextProperty = 
     DependencyProperty.Register("DocumentText", typeof(string), 
     typeof(MaskedTextBox), new PropertyMetadata(default(string), TextChangedCallback)); 

    private static void TextChangedCallback(DependencyObject 
    dependencyObject, DependencyPropertyChangedEventArgs 
    dependencyPropertyChangedEventArgs) 
    { 
     var control = (MaskedTextBox)dependencyObject; 
     control.Text= dependencyPropertyChangedEventArgs.NewValue.ToString(); 
    } 

    public string DocumentText 
    { 
     get { return (string)GetValue(DocumentTextProperty); } 
     set { SetValue(DocumentTextProperty, value); } 
    } 
} 

<StackPanel Margin="50,5,5,50"> 
     <local:MaskedTextBox x:Name="text1" DocumentText="{Binding ElementName=text2, Path=Text, Mode=OneWay}"/> 
     <TextBox x:Name="text2"/> 
    </StackPanel> 

Здесь, если вы редактируете второе текстовое поле, оно сначала обновляется, вызвав метод обратного вызова правильно!

+0

Спасибо Kiran, но мне нужно иметь привязку, определенную в классе фабрики, между свойством dependency и свойством View Model, чтобы при использовании кода i менялось значение свойства View Model, обновляемого браузером. – Kaddy

+0

Привет, товарищ, я не очень уверен, может быть в том заводском методе, который вы пытаетесь установить для свойства Dependency вашего элемента управления. Если это верно, то вы не используете правильный метод для установки значения. Метод SetBinding используется для установки привязки к элементу управления. С другой стороны, метод SetValue используется для обновления значения свойства зависимостей элемента управления. Ниже приведены фрагменты, демонстрирующие дальнейшее использование сложных комментариев. –

+0

// DocumentText = "{Binding TestString, Mode = OneWay}" myControl.SetBinding (MaskedTextBox.DocumentTextProperty, новый Binding() {Source = DataContext, Path = new PropertyPath (nameof (TestString)), Mode = BindingMode.OneWay}); TestString = «тестирование»; // это будет показано в управлении «тестирование», так как управление переплетено СравниваемаяСтрока собственность» myControl.SetValue (MaskedTextBox.DocumentTextProperty,„Другое тестирование“); // это будет показано в управлении«Another тестирования 'потому что значение свойства управления обновляется программно здесь " –

Смежные вопросы