2014-09-11 125 views
0

我試圖用一個右鍵單擊contextmenu來綁定一個listview到List<OrderPaymentVm> OrderPayments 得到PaymentTransactionId如何綁定一個帶有contextMenu的WPF ListView來查看Model

我在表格下面的屬性視圖模型

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

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

視圖模型

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設計說有一個問題EM與GridViewColumn綁定,它強調他們並說,它無法解析屬性,但它編譯和工作正常

問題2 的ConextMenu命令未命中視圖模型命令RelayCommand CopyPaymentTransactionId

我敢肯定,這些都是很簡單然而,即使我正在旋轉我的車輪,有沒有人有任何建議?

謝謝

+0

XAML設計人員經常對我說謊有關錯誤。我通常通過在運行時查看輸出窗口來驗證綁定。關於你的命令綁定,我也遇到了命令綁定不觸發的問題。因此,我勉強地寫代碼隱藏來處理點擊事件,並在稍後允許的時候爲重構機會留下筆記。 – 2014-09-11 02:11:41

+0

嘗試使用視圖模型構造函數中的相應委託賦值來初始化您的中繼命令。 – 2014-09-11 02:15:29

+0

感謝您的意見,是啊我覺得即時通訊被騙到問題1 – 2014-09-11 02:18:29

回答

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我愛stackoverflow感謝 – 2014-09-11 02:17:21

-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