Как привязать кнопку к делегированной команде? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть список, который выглядит следующим образом. В списке мне нужны кнопки, которые что-то делают с помощью делегированной команды.

 <dxe:ListBoxEdit
    Grid.Row="0"
    Grid.Column="5"
    Margin="0,50,0,0"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch"
    DisplayMember="Name"
    ItemSource="{Binding Items}"
    ItemTemplate="{StaticResource ItemTemplate}"
    Name="lista"
    SelectionMode="Single"
    ScrollViewer.CanContentScroll="True">
</dxe:ListBoxEdit>

и dataTemplate выглядят так:

<Window.Resources>
    <DataTemplate x:Key="ProductsTemplate" >
        <dxe:ListBoxEditItem>
            <DockPanel>
                <Image Source="{Binding Picture}" HorizontalAlignment="Left" Margin="25 50"/>
                <TextBlock FontSize="14" TextWrapping="Wrap">
                    <TextBlock.Text >
                        <MultiBinding StringFormat="{}{0}           Price: {1}          TaxRateLevel: {2}  ">
                            <Binding Path="Name" />
                            <Binding Path="Price" />
                            <Binding Path="TaxRateLevel" />
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
                <Button Content="Add" Command ="{Binding AddCommand}"></Button>
            </DockPanel>
        </dxe:ListBoxEditItem>
    </DataTemplate>
</Window.Resources>

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Если ViewModel установлен на DataContext окна, а AddCommand установлен на основном уровне ViewModel, то команда должна знать, с какими элементами она работает. То есть команде обязательно требуется обработка параметров. Данные, необходимые для команды, извлекаются из параметра. Как именно это делается, зависит от используемой вами структуры.

Для привязки вы можете сделать следующее:

  1. Дайте имя окну <Window x:Name="main"....

  2. Привязать к DataContext окна с использованием привязки типа ElementName и передачи текущего элемента в параметре:

XAML:

<Button Content="Add"
      Command ="{Binding DataContext.AddCommand, ElementName=main}"
      CommandParameter="{Binding}"/>

Также из вашего вопроса непонятна раскладка элементов. В ListBox вы используете шаблон с именем «ItemTemplate» для элемента, но вы его не отображали. Вы показываете шаблон "ProductsTemplate", но неясно, где он используется.

0 голосов
/ 06 августа 2020

Если вы используете MVVM (Model-View-ViewModel) , вы можете достичь результата с помощью RelayCommand.

В вашем файле ViewModel вам необходимо объявить свою команду:

public RelayCommand YourCommand { get; set; }

Затем вам нужно инициализировать его (например, в конструкторе модели представления):

YourCommand = new RelayCommand(YourMethodName);

Наконец, для XAML у меня есть этот пример ListBox, который вы можете адаптироваться к вашей конкретной c ситуации:

<ListBox 
        x:Name="Files" 
        ItemsSource="{Binding Items, Mode=TwoWay}"
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}">                                    
                    <TextBlock.InputBindings>
                        <MouseBinding  
                         Gesture="LeftDoubleClick" 
                         Command="{Binding YourCommand }"/>
                    </TextBlock.InputBindings>
               </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Как вы можете видеть в этом примере, у нас есть ListBox, который связывает некоторые данные. Чтобы установить команду, мы получаем доступ к TextBlock внутри ListBox.ItemTemplate и добавляем команду для жеста LeftDoubleClick.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...