2009-04-12 49 views
5

WPFのListBoxにバインドされたObservableCollectionがあります。 ListBoxを編集可能にし、編集の変更をコレクションに保存したい。 WPFは編集可能なリストボックスを提供しないので、ListBox.ItemTemplateを変更して自分自身を作成し​​ようとしました。 ItemTemplateに変更編集可能なWPFリストボックス

<ListBox.ItemTemplate> 
    <DataTemplate>      
     <TextBox Name="EditableText" Text="{TemplateBinding Content}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

は私に編集可能なボックスを与えるが、テキストボックスへの変更はのObservableCollectionに保存されますいけません。双方向バインディングで編集可能なListBoxを持つ方法はありますか?

答えて

8

このようにすることはできません。

この種のトリックを達成するには、アイテムを「ホルダークラス」にして、テキストボックスをバインドできるプロパティを公開する必要があります。

呼び出しの次の擬似シーケンス想像し、それを理解するには:あなたのテンプレート(リストボックス付きのDataTemplate)がロードされ、(私はあなたのケースでは、文字列であると仮定)アイテムが渡さ

class ListBox 
{ 
    Bind(Items) 
    { 
    foreach(var item in Items) 
    { 
     DataTemplate Template = LoadTemplateForItem(item.GetType()); // this is where your template get loaded 
     Template.Bind(item); //this is where your template gets bound 
    } 
    } 
} 

をin。 この時点では、文字列のみが認識され、上方向には何も影響しません。双方向バインディングは、テンプレートがどのコンテキストで使用されているかを認識していないため、元のコレクションに戻って内容を変更できないため、コレクションに影響を与えることはできません。 これは、TextBoxの場合と同じことです。それがconainerとプロパティ名を与えられていない場合、変更を "保存"することはありません。 これは基本的に文字列を関数呼び出しに渡すのと同じです。この関数は、渡された文字列を変更することはできません(参照引数渡しなどのトリックを無視します)。

public class MyDataItem 
{ 
    string Data { get; set;} 
} 

は、その後、あなたはそれらのコレクションにあなたのListBoxをバインドすることができます。

は、あなたのケースに戻って取得するには、編集する必要があります値を含むプロパティを公開するオブジェクトのコレクションを構築する必要がありますあなたのデータ型を変更してください:

<ListBox.ItemTemplate> 
    <DataTemplate>            
      <TextBox Name="EditableText" Text="{Binding Data, Mode=TwoWay}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

私は同様の問題がありますが、私はWPFで非常に新しいので、文字列のリストがあり、バインドできる実際のプロパティがない場合、{バインディングデータ、モード= TwoWay}を書く方法がわかりません –

+1

それは私の答えのポイントです... 文字列のリストを作成し、それらの文字列を保持するオブジェクトのリストを作成する必要があります(それぞれのオブジェクトはプロパティを介してアクセス可能な1つの文字列を保持します)。 。 –

0

コンテンツなどのビュープロパティではなく、モデルプロパティ(つまりデータオブジェクトのプロパティ)にバインドします。例:

ItemsSourceがObservableCollection(バインドするプロパティがないため)の場合、これは機能しません。

+0

データオブジェクトにテキストボックステキストを直接バインドすることはできません。あなたの例では、単一の文字列にバインドするが、私のクラスは、それらのコレクションを持って、私は文字列のリストにテキストプロパティを設定することはできません。 –

+0

DataTemplateはItemsコレクションの各メンバーに対して繰り返され、バインディングはそのメンバーに設定されます。 – itowlson

関連する問題