W moim pliku XAML mam DataGrid z menu kontekstowym. Źródłem danych jest ViewModel, który ma właściwość EntityCollection
(ObservableCollection) jako ItemsSource of DataGrid i inną kolekcję ContextMenu.MenuItems
, która służy jako źródło danych do utworzenia menu kontekstowego w DataGrid. Elementy tej kolekcji mają Command
nieruchomości, które wiążę z właściwością dowodzenie elementów menu:Powiązanie parametru polecenia menu kontekstowego z właściwością datagrid
<DataGrid Name="EntityDataGrid" ItemsSource="{Binding EntityCollection}" Height="450">
<DataGrid.ContextMenu>
<ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding Command}" />
<Setter Property="CommandParameter"
Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" />
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
Akcja dla polecenia menu zawiera następujące podpis w ViewModel:
private void SelectedItemsAction(object parameter)
{
// Do something with "parameter"
}
Teraz mój problem polega na tym, że po kliknięciu elementu menu kontekstowego osiągam SelectedItemsAction
, ale parameter
to null
. Uważam, że mój problem dotyczy ustawiacza dla właściwości CommandParameter
. Jak widać, chcę związać nieruchomość na własność DataGrid SelectedItems
ustawiając wartość:
<Setter Property="CommandParameter"
Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" />
próbowałem prostszych wartości jako test:
<Setter Property="CommandParameter"
Value="{Binding ElementName=EntityDataGrid, Path=Height}" />
Tu parameter
nadal jest null
. A potem po prostu sprawdzić, czy każdy parametr osiąga moją metodę działania w ogóle:
<Setter Property="CommandParameter"
Value="10" />
To działa, parameter
w moim metody działania jest teraz rzeczywiście 10
.
Co robię źle przypisując wartość CommandParameter
do właściwości EntityDataGrid
? Czy to w ogóle możliwe?
Dziękujemy za pomoc z góry!
Świetnie, dziękuję, to działa! (Teraz muszę tylko przeczytać nieco więcej o wiązaniu WPF, aby zrozumieć, co dokładnie robi twój kod;)) – Slauma
Podchodzi do drzewa, aby znaleźć element, który pasuje do tego typu. Pierwszy, który do niego dojdzie, wykorzystuje go jako kontekst wiążący. – CodeWarrior
W międzyczasie przeczytałem więcej o wiązaniu i teraz jest jasne, dlaczego mój oryginalny znacznik nie działa i dlaczego twój kod jest poprawny. Dzięki za wyjaśnienie! – Slauma