Laden...

Converter für CommandParameter in InvokeCommandAction

Erstellt von Mallett vor 3 Jahren Letzter Beitrag vor 2 Jahren 344 Views
M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 3 Jahren
Converter für CommandParameter in InvokeCommandAction

Hallo zusammen,

ich habe ein Problem mit dem ich nicht weiter komme und hoffe es kann mir jemand helfen.

Ich habe ein Datagrid in meinem XAML mit einem EventTrigger + InvokeCommandAction


<i:EventTrigger EventName="ColumnReordered">
                        <i:InvokeCommandAction
                            Command="{Binding HistoryColumnsReordered}"
                            CommandParameter="{Binding Columns, UpdateSourceTrigger=PropertyChanged, ElementName=historyGrid, Converter={StaticResource DatagridColumnsToDisplayIndicesConverter}}" />
</i:EventTrigger>

Mein Problem ist, wenn ich einen Breakpoint in den DatagridColumnsToDisplayIndicesConverter setze, kommt er dort nur genau einmal hin (und tut auch was er soll), anschließend wird das Command auch mit dem korrekten Parameter aufgerufen.

Wenn ich jetzt manuell im Datagrid eine Spalte verschiebe, wird zwar das Command aufgerufen, aber der übergebene Parameter ist derselbe wie beim ersten Aufruf und der Converter wird nicht mehr durchlaufen.

Kann sich darauf jemand einen Reim machen?

Ich würde erwarten, dass der Converter jedes Mal durchlaufen wird. Und ich frage mich auch, wenn er nicht durchlaufen wird, woher bekommt das Command im Viewmodel den alten Parameter-Wert immer wieder?

Hier noch der Code des Converters, auch wenn der vermutlich keine Rolle für das Problem spielt:


public class DatagridColumnsToDisplayIndicesConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is Collection<DataGridColumn> columns)
            {
                List<Tuple<int, string>> columnIndices = columns.Select(column => new Tuple<int, string>(column.DisplayIndex, (string)column.Header)).ToList();
                System.Diagnostics.Debug.WriteLine("DatagricColumnsToDisplayIndicesConverter " + string.Join(",", columnIndices.Select(x => x.Item1)));
                return columnIndices;
            }

            throw new ArgumentException("Invalid binding parameters for DatagridColumnsToDisplayIndicesConverter, parameter must be a value of type Collection<DatagridColumn>!");
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new Exception("Invalid call - one way only");
        }
    }

Danke schonmal

F
10.010 Beiträge seit 2004
vor 2 Jahren

Hatte ein ähnliches Problem.
Die Lösung war, commandparameter müssen im xaml vor dem command stehen

M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 2 Jahren

Nein, das wars leider nicht 🙁

U
69 Beiträge seit 2019
vor 2 Jahren

Ich würde das Binding Testweise mal direkt auf das historyGrid setzen und dann im Converter die Columns mit historyGrid.Columns abfragen.
Da Columns keine DependencyProperty ist, wird der Wert für den CommandParameter nie aktualisiert.

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob