WPF, Silverlight, Windows Phone 8 und Windows-Store-Apps

XAML Expertise: ObservableCollection bei Änderungen informieren
Kommentare

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „WPF: ObservableCollection bei Änderungen informieren“.

Die ObservableCollection unterstützt Benachrichtigungen bei Änderungen innerhalb der Collection, wenn ein Item hinzugefügt oder entfernt wird. Die Oberfläche bekommt allerdings keine Information, wenn die Änderung direkt an einem Item vorgenommen wird. In der Regel hilft eine INotifyPropertyChanged-Implementierung, die aber nicht in Entities vorhanden sein sollte. Eine einfache Lösung bietet die CollectionViewSource.

ObservableCollection mittels CollectionViewSource informieren

Dieser überreicht man die aktuelle ObservableCollection-Instanz und ruft die Refresh-Methode auf.
Bei einem kleinen Beispiel haben wir eine Oberfläche mit einer ListView und einem Button (Listing 1). Wird der Button geklickt, ändert sich ein Wert innerhalb eines Customer-Items. Im ViewModel wird deshalb die ObservableCollection bei der Änderung mittels CollectionViewSource informiert, wie es in Listing 2 demonstriert wird.

Listing 1: XAML-Oberfläche, die auf Änderung innerhalb eines Items reagieren soll

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfRefreshObservable" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" mc:Ignorable="d" x:Class="WpfRefreshObservable.MainWindow"
        Title="MainWindow" Height="350" Width="525">

  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="93*"/>
      <RowDefinition Height="14*"/>
    </Grid.RowDefinitions>
    <Grid.DataContext>
      <local:MainWindowViewModel/>
    </Grid.DataContext>
    <ListView Margin="10,10,10.4,10.2" ItemsSource="{Binding Customers}" DisplayMemberPath="Name"/>
    <Button Content="Change value" Margin="10,9.8,0,0" VerticalAlignment="Top" Grid.Row="1" Height="22" HorizontalAlignment="Left" Width="110">
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
          <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeCustomerValue"/>
        </i:EventTrigger>
      </i:Interaction.Triggers>
    </Button>

  </Grid>
</Window>

Listing 2: Die „CollectionViewSource“ informiert die „ObservableCollection“ über Änderungen

public class MainWindowViewModel { public ObservableCollection<Customer> Customers { get; set; } public MainWindowViewModel() { Customers = new ObservableCollection<Customer> { new Customer {Name = „Gregor“}, new Customer {Name = „Christine“} }; } public void ChangeCustomerValue() { Customers[0].Name = „Wow.. changed..“; CollectionViewSource.GetDefaultView(Customers).Refresh(); } }

Aufmacherbild: binoculars cat searching, looking and observing with care von Shutterstock/Urheberrecht: Rasulov

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -