2012-02-22 22 views
0

ListViewの選択が変更されたときにTextBlockのテキストを変更するにはどうすればよいですか?
私は手動でこれをしたくありません...
ListViewのすべてのアイテムはLogEntry(クラス)です... TextBlockのText-AttributeでBindingを使用して、選択したItemの特定のプロパティを取得できますか?TextBlock ListViewアイテムからのテキストバインディング

<ListView ItemSource="{Binding LogEntries}" Name="logs" IsSynchronizedWithCurrentItem="True"> 


</ListView> 


<ContentControl Content="{Binding ElementName=logs, Path=SelectedItem}" ContentTemplate="{StaticResource logTemplate}"/> 

今、あなたはリソースのことlogTemplateを提供する必要があります:あなたはこのようなリストビューを持っていると仮定し

答えて

2

はい、実際には複数のソリューションがありますが、私はあなたの答えのような最も「WPF」を与えるが、芋も少なく柔軟。

まずあなたがアイテムを選択した場合さて、バウンドCollectionViewはのCurrentItemとして項目を設定しますIsSynchronizedWithCurrentItem="True"property

を設定する必要があります。

これで、TextBox/Blockは、 '/'を使用した特殊なバインディング構文を使用して、この特定の項目にバインドできます。例については :あなたがaswell

<TextBlock Text="{Binding LogEntries/WarningMessage}"/> 

役立ちます希望を結合することにより、現在の項目から特定のプロパティを取得することができますもちろんの

<TextBlock Text="{Binding LogEntries/}"/> 

+0

しかし、ListViewの選択が変更されると、TextBox-Textが更新される必要があります。したがって、ListViewの特定の項目と、すべてのTextBoxに対して、LogEntry-Itemの特定のプロパティ(DependencyProperty) ... –

+0

心配しないでください。コレクションをItemsControlにバインドすると、WPFはコントロールとコレクションの間にCollectionViewがバインドされず、直接バインドしません。 IsSynchronizedWithCurrentItemを使用すると、collectionviewは選択した項目を追跡します。コレクションにバインドすると、バインディングはCollectionViewを認識します。したがって、コレクションにバインドするすべてのコントロールは、現在のアイテムにもアクセスできます。 – dowhilefor

+0

OK作品:Dありがとうございます。 –

1

<UserControl.Resources> 
    <DataTemplate DataType="{x:Type local:LogEntry}"> 
     <TextBlock Text="{Binding Path=LogText}"/> <-- This is a Property-Binding of your custom class 
    </DataTemplate> 
</UserControl.Resources> 

最後に欠けているのは、ローカルクラスLogEntryに名前空間を提供することです。 Resharperのようなすばらしいツールを使用すると、名前空間が挿入されます。そうでない場合は、ここではサンプルの宣言は:

<UserControl xmlns:local="clr-namespace:My.App.Namespace.LogEntry;assembly=My.App" 
... (rest of namespace declarations) 
+0

ContentControlの機能がわかりません... –

+0

申し訳ありませんが、さらに進んでいます... –

+0

はい、ItemsSourceは正しいです。 内部的にObservableCollection を使用し、LogEntryはDependencyObjectのサブクラスです。 –

関連する問題