Как привязать щелчок команды MenuContextItem от одного пользовательского элемента управления к другому в WPF - PullRequest
0 голосов
/ 10 июля 2019

В моем коде у меня есть следующие пользовательские элементы управления

  1. MyListUserControl
  2. MyListItemUserControl

MyListUserControl загружает список с элементами, загруженными из MyListItemUserControl,

на MyListItemUserControl У меня есть кнопка, при нажатии которой я показываю ContextMenu с несколькими опциями.

Теперь при нажатии этого MenuItem я должен вызвать метод из MyListUserControl, возможно ли это сделать?

Короче говоря, это структура, которая у меня есть

  MyListUserControl -> MyListItemUserControl -> ContextMenu Item Click -> Command from MyListUserControl 

Если я пишу код ListItem в том же ListUserControl, он работает нормально.Но я бы предпочел код элемента и списка в отдельных классах.

MyListUserControl xaml Code

    <ListView ItemsSource="{Binding Data}">
           <ListView.ItemTemplate>
                 <DataTemplate>
                       <local1:MyListItemUserControl HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
                           CommentData="{Binding}"/>
                                </DataTemplate>
            </ListView.ItemTemplate>
     </ListView>

В этом классе определен DelegateCommand, который я хотел бывызов из MyListItemUserControl

MyListItemUserControl xaml

<ContextMenu>
     <MenuItem Command="{Binding Source={StaticResource Proxy}, Path=Data.MenuItem_Clicked}"
                            Header="{x:Static propertyRes:Resources.Txt_Copy}"
                            Style="{StaticResource menuItems}" />
     <MenuItem Header="{x:Static propertyRes:Resources.Txt_Edit}" Style="{StaticResource menuItems}" />
     <MenuItem Header="{x:Static propertyRes:Resources.Txt_Delete}" Style="{StaticResource menuItems}" />
</ContextMenu>

1 Ответ

0 голосов
/ 10 июля 2019

это псевдокод, но его должно быть достаточно, чтобы вы поняли идею

<MyListItemUserControl>
    <MyListItemUserControl.ItemTemplate>
        <Grid>
            <Grid.ContextMenu>
                <ContextMenu>
                    <ContextMenuItem 
                    Header="Do stuff"
                    Command="{Binding ElementName=DetailsView, Path=DataContext.DoStuffCommand" 
                    CommandParameter="{Binding}"/>
                </ContextMenu>
            </Grid.ContextMenu>
            <!-- your content -->
        </Grid>
    </<MyListItemUserControl.ItemTemplate>
</MyListItemUserControl>

<MyListItemUserControl x:Name="DetailsView">
<!-- I assume that data context is MyListItemViewModel or something similar
   it has the command: DataContext.DoStuff that takes items from list as parameter -->
</MyListItemUserControl>

EDIT:

Если ваши элементы управления определены в отдельных файлах, вам просто нужно передать commnad. Я обычно делаю это, добавляя свойство зависимостей в коде, который содержит команду:

 public static readonly DependencyProperty DoStuffCommandProperty = DependencyProperty.Register(
            "DoStuffCommand", typeof(ICommand), typeof(MainWindow), new PropertyMetadata(default(ICommand)));

        public ICommand DoStuffCommand
        {
            get { return (ICommand) GetValue(DoStuffCommandProperty); }
            set { SetValue(DoStuffCommandProperty, value); }
        }

так что вы можете сделать:

<ListView ItemsSource="{Binding Data}">
           <ListView.ItemTemplate>
                 <DataTemplate>
                       <local1:MyListItemUserControl HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
                           CommentData="{Binding}" DoStuffCommand="{Binding DoStuffCommandInSomeViewModel}"/>
                                </DataTemplate>
            </ListView.ItemTemplate>
     </ListView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...