none
MenuFlyout MenuFlyoutItem Command DataBinding mit Übermittlung des "sender" als Parameter RRS feed

  • Allgemeine Diskussion

  • Hallo,

    Ich versuche folgendes Problem zu lösen und benötige etwas Hilfe (PRISM ist implementiert):

    Ich habe eine ListBox per Datenbindung an eine ObservableCollection gehängt. Einträge eintragen läuft problemlos. Nun möchte ich sie ändern, löschen und verschieben können. Das ganze soll mit einem MenuFlyout am entsprechenden Item in der Listbox möglich sein.

    Der XAML Code sieht folgendermaßen aus:

    <controls:PageBase.Resources>
            <DataTemplate x:Key="CheckListEntry">
                <Grid Width="{Binding ActualWidth, ElementName=ContentPanel, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Height="Auto" Holding="Grid_Holding">
                    <FlyoutBase.AttachedFlyout>
                        <MenuFlyout>
                            <MenuFlyoutItem x:Name="Edit" Text="Edit"/>
                            <MenuFlyoutItem x:Name="Delete" Text="Delete" Command="{Binding DeleteCommand}"/>
                            <MenuFlyoutItem x:Name="MoveUp" Text="Move Up" Command="{Binding MoveUpCommand}"/>
                            <MenuFlyoutItem x:Name="MoveDn" Text="Move Down" Command="{Binding MoveDownCommand}"/>
                        </MenuFlyout>
                    </FlyoutBase.AttachedFlyout>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="7*"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="{Binding Item, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Foreground="White" FontSize="24" VerticalAlignment="Center"/>
                    <CheckBox Grid.Column="1" IsChecked="{Binding Checked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Command="{Binding SaveCollectionToFile}"/>
                </Grid>
            </DataTemplate>
        </controls:PageBase.Resources>Eines der Commands sieht folgendermaßen aus:

    Eines der Commands sieht folgendermaßen aus:

    private DelegateCommand<CheckListItem> _deleteCommand;
    public DelegateCommand<CheckListItem> DeleteCommand
            {
                get
                {
                    if (_deleteCommand != null)
                        return _deleteCommand;
                    _deleteCommand = new DelegateCommand<CheckListItem>
                        (
                            (item) =>
                            {
                                Collection.Remove(item);
                            }
                        );
                    return _deleteCommand;
                }
            }

    Weis jemand was ich als Command Parameter mitschicken muss um das CheckListItem zu erhalten und ob DelegateCommand<CheckListItem> korrekt ist oder "object" mit casten oder Typwandlung besser ist?

    Oder ist mein Weg komplett falsch?

    Samstag, 12. September 2015 14:03

Alle Antworten

  • Hallo,

    ich vermute mal das dein DataTemplate für das anzeigen eines CheckListItem gedacht ist. Du kannst den CommandParameter beispielsweise wie folgt belegen:

    <MenuFlyoutItem x:Name="Delete" Text="Delete" Command="{Binding DeleteCommand}" CommandParameter="{Binding }"/>

    Da man hier keinen Pfad für das Binding angibt, wird einfach das gesamte Item an sich gebunden und im ViewModel erhält man wiederum das CheckListItem als CommandParameter.

    Wenn es geht sollte man es vermeiden mit Object und unnötigen casts zu arbeiten. Da du hier einen speziellen Typ hast (DelegateCommand<T>) solltest du diesen auch überall dort verwenden wo du weißt das er zum Einsatz kommt.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 12. September 2015 15:43
    Moderator
  • Danke erstmal dafür.

    Was aber noch nicht funktioniert ist das Auslösen des Commands, habe einen Breakpoint gesetzt und leider passiert beim drücken des Menüpunktes gar nichts. Ich mal testweise den Click-Event in der Code-Behind Datei implementiert, dieser funktioniert tadellos.

    Samstag, 12. September 2015 22:11
  • Hallo c0d3_m,

    bist du weitergekommen?

    Gruß

    Aleksander


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht,  kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 29. September 2015 07:53
  • Nein, habe es anders gelöst, nämlich über Auswahlkästchen. Außerdem lassen sich die Einträge auch verschieben und die neue Ordnung wird automatisch an die Collection übergeben in Echtzeit.
    Freitag, 2. Oktober 2015 09:10