2016-04-30 21 views
1

私はDocTextが初めて設定されたときにコールバックが呼び出される以下のコードで問題に直面しています。その後DocTextを設定してもコールバックは呼び出されません。 DocTextプロパティに同じ文字列を設定して、ブラウザのhtmlをリセットしようとしています。ウェブブラウザのインス​​タンスを作成しますコールバックが2回目に動作しない

の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

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> 

ここで、2番目のテキストボックスを編集すると、最初にコールバックメソッドを正しく呼び出して更新しています。

+0

ありがとうKiranしかし、依存関係プロパティとView Modelプロパティの間でファクトリクラスで定義されたバインディングを持つことができるようにする必要があります。コードを使用して、View Modelプロパティの値を変更するとブラウザコントロールが更新されます。 – Kaddy

+0

こんにちは、私はあなたのコントロールの依存関係プロパティに値を設定しようとしているファクトリメソッドにあるかもしれません。これが当てはまる場合は、適切なメソッドを使用して値を設定していません。 SetBindingメソッドは、コントロールへのバインドを設定するために使用されます。一方、SetValueメソッドは、コントロールの依存関係プロパティの値を更新するために使用されます。以下は、精巧なコメントを使用してさらに説明するスニペットです。メソッド名:BindingMode.OneWay); –

+0

// DocumentText = "{Binding TestString、Mode = OneWay}" myControl.SetBinding(MaskedTextBox.DocumentTextProperty、new Binding(){Source = DataContext、Path = new PropertyPath(nameof(TestString))、 ); TestString = "テスト中"; //コントロールがたTestStringプロパティ」 myControl.SetValue(MaskedTextBox.DocumentTextProperty、 『もう一つのテスト』)にバインドされているので、これは「それをテスト」コントロールに表示されます。 //これはコントロールに表示される「もう一つのテスト'コントロールプロパティの値がここでプログラム的に更新されるためです。 –

関連する問題