2014-09-11 5 views
0

Я пытаюсь связать listview с List<OrderPaymentVm> OrderPayments с контекстным меню правой кнопкой мыши, чтобы получить PaymentTransactionId.Как связать WPF ListView с contextMenu для просмотраModel

Я следующее свойство в своих формах Модельное

public List<OrderPaymentVm> OrderPayments 
    { 
    get 
    { 
     return _orderPayments; 
    } 

    private set 
    { 
     _orderPayments = value; 
     RaisePropertyChanged(() => OrderPayments); 
    } 
    } 

В ViewModel

public class OrderPaymentVm : ViewModelBase 
    { 

     private RelayCommand _copyPaymentTransactionId; 
     public DateTime PaymentTime { get; set; } 
     public PaymentType PaymentType { get; set; } 
     public string Explanation { get; set; } 
     public string PaymentTransactionId { get; set; } 
     public decimal Amount { get; set; } 
     public RelayCommand CopyPaymentTransactionId 
     { 
     get { return _copyPaymentTransactionId ?? (_copyPaymentTransactionId = new RelayCommand(ExecuteCopyPaymentTransactionId)); } 
     } 

     private void ExecuteCopyPaymentTransactionId() 
     { 
     Clipboard.SetText(string.IsNullOrWhiteSpace(PaymentTransactionId) ? string.Empty : PaymentTransactionId); 
     } 

    } 

У меня есть следующий код XAML

<ListView Grid.Row="1" ItemsSource="{Binding OrderPayments}" HorizontalAlignment="Stretch" Margin="0,0,0,1"> 
     <ListView.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Copy Transaction Id" 
        Command="{Binding CopyPaymentTransactionId}" 
        CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" /> 
     </ContextMenu> 
     </ListView.ContextMenu> 
     <ListView.View> 
     <GridView> 
      <GridViewColumn HeaderContainerStyle="{StaticResource HeaderLeftAlign}" Header="Transaction Id" Width="150" DisplayMemberBinding="{Binding PaymentTransactionId}" /> 
      <GridViewColumn HeaderContainerStyle="{StaticResource HeaderLeftAlign}" Header="Time" Width="150" DisplayMemberBinding="{Binding PaymentTime}" /> 
      <GridViewColumn HeaderContainerStyle="{StaticResource HeaderLeftAlign}" Header="Payment Type" Width="100" DisplayMemberBinding="{Binding PaymentType}" /> 
      <GridViewColumn HeaderContainerStyle="{StaticResource HeaderLeftAlign}" Header="Amount" Width="80" DisplayMemberBinding="{Binding Amount, StringFormat='{}{0:C}'}" /> 
      <GridViewColumn HeaderContainerStyle="{StaticResource HeaderLeftAlign}" Header="Explanation" Width="280" DisplayMemberBinding="{Binding Explanation}" /> 
     </GridView> 
     </ListView.View> 
</ListView> 

Задача 1 дизайнер XAML говорит, что есть проблема эм с GridViewColumn привязок, он подчеркивает их и говорит, что он не может разрешить собственности, однако он компилируется и работает отлично

Задача 2 ConextMenu Команда не попав в команду ViewModel RelayCommand CopyPaymentTransactionId

Im уверен, что это просто проблемы, тем не менее, вращение моих колес, есть ли у кого-нибудь какие-либо предложения?

Thanks

+0

Дизайнер XAML часто лжет мне об ошибках. Обычно я проверяю свои привязки, просматривая окно вывода во время выполнения. Что касается привязки команды, у меня также возникли проблемы с привязкой команд, которые не запускаются. В результате я неохотно просто пишу код, чтобы обрабатывать события кликов и делать заметку о возможностях рефакторинга позже, когда позволяет время. –

+0

Попробуйте инициализировать вашу команду реле с соответствующим назначением делегата в конструкторе модели представления. –

+0

Спасибо за ваши комментарии, да, я чувствую, что я лгал в отношении проблемы 1 –

ответ

2

вот решение для второй проблемы. поскольку контекстное меню размещено во всплывающем окне, которое не наследует контекст данных от его родителя, поскольку это отдельный корневой элемент. поэтому вы не можете просто привязываться к модели представления родительского элемента.

здесь пример, чтобы связать команду в контекстном меню

Command="{Binding PlacementTarget.SelectedItem.CopyPaymentTransactionId, 
        RelativeSource={RelativeSource AncestorType=ContextMenu}}" 

похож на команду параметр, необходимо указать источник для команды связывания.

для упрощения вы можете написать такой же, как

<MenuItem Header="Copy Transaction Id" 
      DataContext="{Binding PlacementTarget.SelectedItem, 
           RelativeSource={RelativeSource AncestorType=ContextMenu}}" 
      Command="{Binding CopyPaymentTransactionId}" 
      CommandParameter="{Binding}" /> 
+0

Woah i love stackoverflow спасибо –

-1
public class OrderPaymentVm : ViewModelBase 
{ 

    public OrderPaymentVm() 
    { 
    CopyPaymentTransactionId = new RelayCommand(ExecuteCopyPaymentTransactionId)); 
    } 

. 
. 
. 

    public RelayCommand CopyPaymentTransactionId 
    { 
    get; set; 
    } 

    private void ExecuteCopyPaymentTransactionId() 
    { 
    Clipboard.SetText(string.IsNullOrWhiteSpace(PaymentTransactionId) ? string.Empty : PaymentTransactionId); 
    } 

}

1

Проблема 1: Это потому, что дизайнер не знает, что тип объектов находятся в GridView. Вы знаете это, так что вы можете сделать что-то вроде этого:

<Window ... blah blah blah 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    blah blah... 

И в ListView:

<ListView blah blah 
    d:DataContext="{d:DesignInstance whatevernamespace:WhateverVMYouUse}... 

Обычно явно создавая контексты DesignInstance данных, как это даст вам лучше автозаполнение и удаляет лишние ошибки, которые показывают в дизайнере.

Задача 2: Pushpraj избил меня. также см. this question

Смежные вопросы