#c# #wpf #xaml #commandparameter
#c# #wpf ( ВП ) #xaml #командный параметр #wpf #commandparameter
Вопрос:
У меня есть пользовательский элемент управления ( MainView
) с другим пользовательским элементом управления ( GridView
):
<local:MyGridView x:Name="GridView"/>
По-моему MainView
, у меня есть кнопка:
<Button Command="{Binding TestCommand}"
CommandParameter="{Binding ElementName=DataGrid}"
Content="Test"/>
В моем GridView
, у меня есть таблица данных, которую я хочу отправить как CommanParameter
.
Если бы GridView
код был в MainView
коде, этот синтаксис работал бы. Что я должен изменить?
Я пытался {Binding ElementName=GridView.DataGrid}
— безуспешно.
Комментарии:
1. Примечание: вы не должны использовать элемент представления как
CommandParameter
. Команда находится в viewmodel, которая не должна знать о представлении, о типах, связанных с представлением (напримерDataGrid
), и о конкретной реализации представления.2. Это неправильный подход. Внутренние элементы одного элемента управления не должны быть доступны из другого элемента управления. Первый вместо этого должен предоставлять общедоступное свойство, чтобы обеспечить доступ к его данным.
3. Спасибо за комментарии, я решу эту проблему, добавив команду в код основного представления, а затем извлеку оттуда Datagrid
Ответ №1:
Очень просто.
<local:MyGridView x:Name="**GridView**"/>
<Button Command="{Binding TestCommand}"
CommandParameter="{Binding ElementName=**GridView**}"
Content="Test"/>
Вы должны изменить ИмяэлемЕнта с DataGrid на GridView.
Комментарии:
1. спасибо, я сделал это так, а затем извлек сетку данных из MyGridView в командном методе: отправитель — MyGridView myGridView. а затем myGridView.DataGrid
Ответ №2:
Вы не можете использовать ElementName
для прямой ссылки на элемент, который определен в другом элементе управления или области имен.
Что вы могли бы сделать, так это добавить свойство к MyGridView.xaml.cs
, которое предоставляет DataGrid
элемент управления:
public DataGrid DataGrid => dataGrid1;
Затем вы могли бы привязаться к этому свойству элемента:
<Button Command="{Binding TestCommand}"
CommandParameter="{Binding Path=DataGrid, ElementName=GridView}"
Content="Test"/>
Лучшим подходом было бы использовать общий DataContext
(модель представления) и привязать оба элемента управления к свойствам этого элемента.
Комментарии:
1. @Tinsley: Конечно, это работает, если вы добавляете свойство в
GridView
. Передача элемента управления в модель представления нарушает шаблон MVVM и, тем не менее, что это такое.