2016-11-14 58 views
0

我有ListViewDataTemplate,在這個模板中有幾個文本塊和一個按鈕。該按鈕具有固定項目的上下文菜單。 listviewitems的綁定工作正常,但將屬性綁定到contextmenu似乎不起作用。菜單項綁定datacontext在列表視圖

<ListView x:Name="lv_clients" Margin="0 22 0 0" SelectionMode="Single"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid Grid.Column="0" Grid.RowSpan="2" Background="{Binding StateColor}"> 
       </Grid> 
       <TextBlock Grid.Column="1" Text="{Binding DisplayString}" Foreground="Black" Height="20" FontWeight="Bold" Padding="2,2,0,0" /> 
       <Button Click="Button_ListItem_Click" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Top"> 
        <Button.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="Anrufen" Name="mn_call" Click="mn_call_Click" DataContext={Binding Number} /> 
         </ContextMenu> 
        </Button.ContextMenu> ...</Button> 
       <StackPanel Grid.Column="1" Grid.Row="1"> 
        <TextBlock Text="{Binding State}" Height="20" Padding="2,2,0,0"/> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding FirstEntry.KDKGRS}" Height="20" FontWeight="Bold" Padding="2,2,2,0" HorizontalAlignment="Left" Foreground="{Binding FirstEntry.ConvertedKGFARBE}" /> 
         <TextBlock Text="{Binding FirstEntry.ADNAMI}" Height="20" Padding="0,2,0,0" HorizontalAlignment="Left" /> 
        </StackPanel> 
       </StackPanel> 
      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

我已刪除的代碼(風格和columndefinitions)爲可讀性的一些不必要的位。

重要的部分是Button裏面的MenuItem。我的基礎類有一個公共字符串屬性Number。這應該傳遞給菜單項。但MenuItemDataContext在click事件中始終爲空。

我已經閱讀了一些關於contextmenu的信息,但並沒有將其視爲可視樹的一部分,但我無法將其包裹在它的周圍。有人能解釋這個問題嗎?

編輯代碼爲基礎類: 再次除去一些不必要的代碼的問題

public class PhoneClient 
{ 
    public String Name { get; set; } 
    public String Number { get; set; } 
    public String Extension { get; set; } 
    public String DisplayString 
    { 
     get 
     { 
      return String.IsNullOrEmpty(Name) ? Number : String.Format("{0} ({1})", Name, Extension); 
     } 
    } 
} 

而且列表框的結合:

List<PhoneClient> clients = new List<PhoneClient>(); 
clients = load(); //returns active Clients 
lv_clients.ItemsSource = clients; 
+0

你能顯示數字代碼物業嗎? –

回答

1

縮小差距

<ContextMenu Tag="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
    <MenuItem Header="Anrufen" Click="mn_call_Click" Name="mn_call" 
       DataContext="{Binding Tag.Number, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" /> 
</ContextMenu> 

Handler

private void mn_call_Click(object sender, RoutedEventArgs e) 
{ 
    MenuItem currentMenuItem = (MenuItem)sender; 
    string number = (string)currentMenuItem.DataContext; 
    // Do Stuff 
} 

編輯

MainWindow.xaml

<Window x:Class="WpfApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid Margin="10"> 
     <ListView x:Name="lv_clients" Margin="0 22 0 0" SelectionMode="Single"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Grid Background="LightGray" Width="100"> 
         <Grid.RowDefinitions> 
          <RowDefinition/> 
          <RowDefinition/> 
         </Grid.RowDefinitions> 
         <Grid Background="LightGreen"> 
         </Grid> 
         <TextBlock Text="{Binding DisplayString}" Foreground="Black" Height="20" FontWeight="Bold" Padding="2,2,0,0" /> 
         <Button Click="Button_ListItem_Click" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Top"> 
          <Button.ContextMenu> 
           <ContextMenu Tag="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
            <MenuItem Header="Show" Click="mn_call_Click" Name="mn_call" DataContext="{Binding Tag.Number, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" /> 
           </ContextMenu> 
          </Button.ContextMenu> ... 
         </Button> 
         <StackPanel Grid.Row="1"> 
          <TextBlock Text="{Binding State}" Height="20" Padding="2,2,0,0"/> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="Foo" Height="20" FontWeight="Bold" Padding="2,2,2,0" HorizontalAlignment="Left" Foreground="Blue" /> 
           <TextBlock Text="Bar" Height="20" Padding="0,2,0,0" HorizontalAlignment="Left" /> 
          </StackPanel> 
         </StackPanel> 
        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Collections.Generic; 

namespace WpfApp 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      List<PhoneClient> clients = new List<PhoneClient>(); 
      clients.Add(new PhoneClient() { Name = "Kumar", Number = "0101010", Extension = "555", State = "New York" }); 
      clients.Add(new PhoneClient() { Name = "Shanaya", Number = "1010101", Extension = "555", State = "New Jersey" }); 
      clients.Add(new PhoneClient() { Name = "Billy Bob", Number = "", Extension = "555", State = "Single" }); 

      lv_clients.ItemsSource = clients; 
     } 

     public class PhoneClient 
     { 
      public String Name { get; set; } 
      public String Number { get; set; } 
      public String Extension { get; set; } 
      public String State { get; set; } 
      public String DisplayString 
      { 
       get 
       { 
        return String.IsNullOrEmpty(Name) ? Number : String.Format("{0} ({1})", Name, Extension); 
       } 
      } 
     } 

     private void mn_call_Click(object sender, RoutedEventArgs e) 
     { 
      MenuItem currentMenuItem = (MenuItem)sender; 
      string number = (string)currentMenuItem.DataContext; 
      MessageBox.Show("Number " + number); 
     } 

     private void Button_ListItem_Click(object sender, RoutedEventArgs e) 
     { 
      Button currentButton = (Button)sender; 
      PhoneClient data = (PhoneClient)currentButton.DataContext; 
      MessageBox.Show(data.Name + " tapped"); 
     } 
    } 
} 
+0

這不起作用或者DataContext在Click事件中仍然爲空。 – JoeJoe87577

+0

我發現你的解決方案不起作用的原因。 contextmenu的placementtarget也是null。 – JoeJoe87577

+0

@ JoeJoe87577我在發佈之前測試了代碼。更新了演示項目'WpfApp'。 – Funk