Luca Nate Mahler
Luca Nate Mahler

Reputation: 1332

TextBlock Text-Binding from ListView items

How can I change the Text of a TextBlock when the selection in my ListView changes?
I don't want do this manually...
All Items of the ListView are LogEntry's (class)... Can I use Binding in the Text-Attribute of the TextBlock to get a specific property of the selected Item?

Upvotes: 0

Views: 1772

Answers (2)

mindandmedia
mindandmedia

Reputation: 6825

assuming you have a listview like this:

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


</ListView>


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

Now you need to provide that logTemplate in the Resources.

<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>

The last thing missing is to provide the namespace to your local class LogEntry. If you use an awesome tool like Resharper, it will insert the namespace for you. Otherwise, here a sample declaration:

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

Upvotes: 1

dowhilefor
dowhilefor

Reputation: 11051

Yes, in fact there are multiple solutions, i give you the most "WPF" like answer, but imo also the least flexible.

First you need to set the IsSynchronizedWithCurrentItem="True" property

Now if you select an item, the bound CollectionView will set the item as the CurrentItem.

Now your TextBox/Block can bind to this specific item via a special binding syntax using a '/'. For Example:

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

of course you can get a specific property from the current item via binding aswell

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

Hope that helps.

Upvotes: 2

Related Questions