2011-10-24 17 views
1

こんにちは、私はグリッドで2つのリストビューを持っています。各リストビューにはテキストボックスがあり、両方のリストビューの両方のテキストボックスに同じテキストがあります。いずれかのテキストボックスでテキストの一部を選択すると、もう一方のテキストボックスでもテキストの同じ部分が選択されます。テキストボックス内の選択されたテキスト

2つの異なるリストビューで2つのテキストボックスの間でバインドできますか?

答えて

1

悲しいことに、SelectionText、およびSelectionStartは依存プロパティではないため、2つのテキストボックスはこれらのプロパティに対して双方向バインドできません。

添付の動作を記述し、テキストボックスを別のテキストボックスに添付してTextBox.SelectionChangedEventを処理し、イベントが処理されたときにもう一方を同期させる必要があります。

2

AngelWPFが記述するように、Selection *プロパティは依存関係プロパティではないため、それらに対してデータバインディングを使用することはできません。

あなたができることは、元のプロパティを置き換える依存プロパティを持つTextBoxの独自のサブカルalsを追加することです。これらは、元のプロパティと同じ名前を使用して、通常の依存プロパティとして実装できますが、元のものを置き換えるには、その定義がpublic newである必要があります。

私はここ(あまりにも多くのコードを、私は、このコンピュータ上でそれを持っていない)全体コードサンプルを投稿しませんが、あなたは次のように行うことができます。今すぐ

public class BindableSelectionTextBox : TextBox 
{ 
    // Defines the dependency property as normal 
    public static readonly DependencyProperty SelectedTextProperty = 
    DependencyProperty.RegisterAttached(SelectedText, typeof(string),  
     typeof(BindableSelectionTextBox), 
     new FrameworkPropertyMetadata("", SelectedTextPropertyChanged)); 

    private static void SelectedTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
    var textBox = (TextBox)d; 
    textBox.SelectedText = (string)e.NewValue; 
    } 

    public new string SelectedText 
    { 
    get { return (string)GetValue(SelectedTextProperty); } 
    set 
    { 
     if(value != SelectedText) 
     { 
     SetValue(SelectedTextProperty, value); 
     } 
    } 
    } 

    public BindableSelectionTextBox() 
    { 
    SelectionChanged += OnSelectionChanged; 
    } 

    private void OnSelectionChanged(object sender, RoutedEventArgs e) 
    { 
    SelectedText = base.SelectedText; 
    } 
} 

を、あなたは繰り返す必要がありますこれはSelectionStartSelectionLengthのプロパティのため、これを行う必要があります。

+0

hmm xamlの場合はどうすればいいですか? – edelweiss

+0

Xamlでは、View Modelに対して通常のデータバインディングを使用するだけです。両方のテキストボックスを同じプロパティにバインドし、設定する必要があります。 –

+0

また、2つのプロパティを持つこともできますが、それらを手動で同期する必要があります。 –

関連する問題