Как найти элемент по имени в другом пользовательском элементе управления?

#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 и, тем не менее, что это такое.