2015-08-18 29 views
0

爲了使WPF項目更清晰,我決定在外部UserControl中定義ItemsControl的行佈局。從外部UserControl中的WPF按鈕捕獲事件

這是顯示列表中的主網頁:

<ScrollViewer Name="ItemsScroll" Grid.Row="1" VerticalScrollBarVisibility="Auto"> 
    <ItemsControl Name="ItemsList"> 
     <ItemsControl.Resources> 
      <DataTemplate DataType="{x:Type local:OptionSetItem}"> 
       <local.controls:OptionItemControl /> 
      </DataTemplate> 
     </ItemsControl.Resources> 
    </ItemsControl> 
</ScrollViewer> 

local.controls:OptionItemControl在另一個文件中定義:

<UserControl x:Class="OptionSetManager.Controls.OptionItemControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="100" d:DesignWidth="300"> 

    <Grid Height="30"> 
     <Grid.Resources> 
      <BooleanToVisibilityConverter x:Key="BoolToVis" /> 
     </Grid.Resources> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*" /> 
      <ColumnDefinition Width="7*"/> 
      <ColumnDefinition Width="1*"/> 
     </Grid.ColumnDefinitions> 

     <TextBlock Name="ItemId" Grid.Column="0" VerticalAlignment="Center" TextAlignment="Center" FontSize="16" Foreground="DarkGray" Text="{Binding Id}" /> 
     <TextBox Name="ItemText" Grid.Column="1" VerticalContentAlignment="Center" FontSize="16" Text="{Binding Text}" BorderBrush="{x:Null}" Background="#FFF0F0F0" IsReadOnly="{Binding ToBeDeleted}" HorizontalAlignment="Right" Width="210" /> 
     <Button Name="DeleteExistingButton" Grid.Column="2" Click="DeleteExistingButton_Click" Tag="{Binding Id}" Cursor="Hand" ToolTip="Mark as deleted"> 
      <Button.Template> 
       <ControlTemplate> 
        <Image Source="/Assets/delete.png"/> 
       </ControlTemplate> 
      </Button.Template> 
     </Button> 

     <Rectangle Fill="Red" Height="3" Margin="15,0" Grid.Column="0" Visibility="{Binding ToBeDeleted, Converter={StaticResource BoolToVis}}"></Rectangle> 

    </Grid> 
</UserControl> 

正如你所看到的,定製控件包含DeleteExistingButton觸發一個Click事件。目標是從列表所在的主頁面捕獲此事件。

我跟着一些答案,如this,但我被困在某個點,我會告訴你以後。首先,這是用戶控件後面的代碼:

namespace OptionSetManager.Controls 
{ 
    public partial class OptionItemControl : UserControl 
    { 
     public event EventHandler OnDeleteExistingButtonClick; 

     public OptionItemControl() 
     { 
      InitializeComponent(); 
     } 

     private void DeleteExistingButton_Click(object sender, RoutedEventArgs e) 
     { 
      if (this.OnDeleteExistingButtonClick != null) OnDeleteExistingButtonClick(this, e); 
     } 
    } 
} 

在這裏,我傳播的事件的處理程序,如果存在。我應該從主網頁連接,但很明顯,我不能做這樣

OptionItemControl.OnDeleteExistingButtonClick += new EventHandler(UserControl_ButtonClick); 

東西,因爲OptionItemControl不是一個對象的實例,但只是在DataTemplate中的一個元素。

我錯過了什麼?

+1

你可以在你的DataTemplate中處理一個事件:如果我明白你的問題對了 – nkoniishvt

+0

WOAH!那很簡單嗎?請把它寫成答案,我會接受它;) – TheUnexpected

回答

0

你可以在你的DataTemplate語法如下處理您OnDeleteExistingButtonClick事件:

<DataTemplate DataType="{x:Type local:OptionSetItem}"> 
    <local.controls:OptionItemControl OnDeleteExistingButtonClick="YourHandler"/> 
</DataTemplate> 

注意:您應該爲您的活動DeleteExistingButtonClick而不是OnDeleteExistingButtonClick(這是一個慣例,引發該事件應該被命名功能OnYourEvent或RaiseYourEvent)

相關問題