2013-10-24 5 views
2

이것은 C# 및 WPF 용으로 가장 좋은 온라인 도움말 사이트로 간주되는 stackoverlow에 대한 첫 번째 게시물입니다.C# WPF UserControl에서 ControlTemplate에 정의 된 버튼에 액세스 할 수 없습니다.

저는 스타일로 정의한 버튼에 버튼 핸들러 이벤트를 첨부하는 방법을 알아 내려고 지난 3 일 동안 약 6 시간 이상을 조사했습니다. 내 상황은 웹에서 본 다른 모든 사례와는 다른 것으로 보인다. 그래서 여기에 가서 당신의 의견을 분명히 감사드립니다.

<ScrollViewer Grid.Column="2" Grid.ColumnSpan="2" 
     HorizontalScrollBarVisibility="Visible" 
     VerticalScrollBarVisibility="Hidden" 
     Background="AliceBlue"> 
    <ItemsControl ItemsSource="{Binding LaserDataItems}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" Background="AliceBlue" /> 
     </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
    </ScrollViewer> 

다음 내가 그리드 내에서 정의 MainWindow.xaml에서 조각이 LaserDataItems에 바인딩 필요에 따라 동적으로 생성되는 display.These에 추가 된 UserControls의 목록이 포함됩니다. 하지만 실제로 컨트롤 뒤에 코드에서 모든 작업을 시도합니다 (아래)

내가 UserControl을 보여주기 전에 여기에 UserControl과 함께 사용할 스타일이 나와 있습니다. 이 여기에

<Style x:Key="HeaderStyle" TargetType="{x:Type DataGridColumnHeader}">    
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
      <Button x:Name="MyButton" Height="20"/> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

템플릿을 할당 ColumnHeaderStyle이있는 UserControl의 데이터 그리드 내에서 UserControl을

<UserControl x:Class="EClient.Controls.GetAllLaserData" 
      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="300" d:DesignWidth="300"> 
    <DataGrid Name="laserDataGrid" 
       ColumnHeaderStyle="{StaticResource HeaderStyle}" 
       AutoGenerateColumns="False" 
       ItemsSource="{Binding }" 
       IsReadOnly="True" 
       RowHeaderWidth="0" 
       Height="567" 
       VerticalAlignment="Top" 
       RowHeight="17"> 
     <DataGrid.Columns> 
      <DataGridTextColumn 
      Width="53" 
      Header="{Binding HeaderName}" 
      Binding="{Binding Name}"></DataGridTextColumn> 
     </DataGrid.Columns> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
       <Setter Property="IsEnabled" Value="False"/> 
      </Style> 
     </DataGrid.RowStyle> 
    </DataGrid> 
</UserControl> 

입니다을로드 한 후 나의 첫번째 목표는 버튼 클릭 이벤트를 만드는 것입니다 : HeaderStyle . 이 스타일에는 클릭 핸들러를 인스턴스화 할 때마다 첨부해야하는 버튼이 있습니다. 어떻게해야합니까? OnApplyTemplate 메서드를 재정 의하여 액세스하려했지만 시도한 모든 것이 null을 반환합니다. 이 메서드가 실행될 때 버튼이 아직 인스턴스화되지 않았습니까? 이 버튼을 사용할 수있는 방법이 있어야합니다.

이것을 실행하고 이러한 UserControls (데이터 격자) 목록을 만들면 버튼이 첫 번째 셀 (각 격자의 머리글)에 표시됩니다.

또한 시각적 트리를 가로 지르지 만 아무 소용이없는 일반적인 루틴을 사용해 보았습니다. 사실 내가 추구해야 할이 무언가가 있습니다. 저는 실제로 시도 할 아이디어가 없어졌습니다. 나는이 문제에 대한 또 다른 해결책을 발견했지만


다음 작품은 2013년 10월 26일

에 추가 된, 나는 아직도 그것을 해결에 관심이 있어요. 정말 좋은 질문이라고 생각했습니다.

어쨌든 나는 무엇을 하려는지 사진을 찍을 것이라고 생각했습니다. 아마 그것은 문제를보다 잘 파악할 수있을 것입니다.

Datagrid with Button Above Grid

+0

다음 링크는 도움이 될 수 있습니다. http://stackoverflow.com/questions/4030764/how-to-get-datagridcolumnheader-from-datagridcolumn http://stackoverflow.com/questions/1658397/wpf-datagrid-header-text - 바인딩 (5 월 없음). – Chris

+0

Chris,이 링크는 실제로 유망 해 보입니다. 고맙습니다. 내가 마을로 돌아 왔을 때 나는 그들에게 한 번 시도해보고 알려 줄 것이다. 감사합니다, 다시 - 릭 – Rick

+0

이 유용 희망 뭔가, 나는 그것이 작동하지 않았다, 뭔가 나 자신을 균열을했고 이유를 이해하려고 할 때 그 우연히 발견했다. – Chris

답변

0

아니 직접 답변 - 여기하지만 내가 문제를 접근 할 방법이다. 대신 DataControl을 선호하는 DataGrid를 사용하지 않으므로 예제에서는 ItemsControl을 사용해야합니다.

목록에서 단추를 처리 할 때 일반적으로 단추가 포함 된 컨트롤을 자체 사용자 정의 컨트롤로 분할합니다 (필요에 따라 스타일 적용). 그런 다음 백그라운드에서 이벤트 처리기를 사용합니다.아래 그림과 같이 XAML

<UserControl x:Class="BindableTest.UserControls.CatItem" 
      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="300" d:DesignWidth="400"> 
    <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left" Margin="0 0 10 0"> 
    <Label Content="{Binding Path=Model.DisplayNumber}" HorizontalAlignment="Left" Height="25" Width="25" /> 
    <TextBox BorderBrush="Black" Text="{Binding Path=Model.SomeText, UpdateSourceTrigger=PropertyChanged}" Width="150" Height="25" /> 
    <StackPanel Orientation="Horizontal"> 
     <Button x:Name="btnDelete" Margin="5 0 0 0" Content="Delete" Click="btnDelete_Click_1"></Button> 
    </StackPanel> 
    </StackPanel> 
</UserControl> 

뒤에 코드 ... 호출 XAML에서

/// <summary> 
    /// Interaction logic for CatItem.xaml 
    /// </summary> 
    public partial class CatItem : UserControl 
    { 
    public CatItem() 
    { 
     InitializeComponent();  
    } 

    private void btnDelete_Click_1(object sender, RoutedEventArgs e) 
    { 
     if (DeleteClick != null) 
     DeleteClick(sender, e); 
    } 

    public event RoutedEventHandler DeleteClick; 


    } 

, 당신은이 이벤트를 사용할 수 있습니다.

<ItemsControl x:Name="itmsList" ItemsSource="{Binding Path=ModelListVMs}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal"></StackPanel> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <uc:CatItem DeleteClick="ItemDeleteClick"></uc:CatItem> <!-- Using click here --> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

창의 배경에서 모든 버튼에 대한 이벤트를 선택할 수 있습니다.

public void ItemDeleteClick(object sender, RoutedEventArgs e) 
    { 
     var ctx = (sender as Button); 

     //can get datacontext and other properties easily from here 
    } 

죄송합니다. 직접적인 답변이 아니지만 올바른 방향으로 도움이 될 것입니다.

+1

HockeyJ, 귀하의 의견에 너무 고마워. 그것은 내 질문에 대답하지 않지만, 내게 내 통제를 재 설계하는 아이디어를 주었다. 나는 컨트롤 템플릿에서 버튼을 꺼내어 버튼 (버튼)을 스택 패널 (데이터 그리드 위의 버튼 포함)에 넣었다. 왜 내가 버튼을 찾을 수 없었는지 궁금 하네. 나는 반복적으로 laserGataGrid 참조를 사용하여 데이터 그리드의 시각적 트리를 통해 갈 때, 무엇을 믿는 I는 데이터 그리드 정의의 조상과 나의 정의 하나 보았다. 그래도 여전히 답변을 찾고 있지만 귀하의 의견에 진심으로 감사드립니다. – Rick

+0

@Rick : 추가 할 정보가 더있는 경우 대답이 아닌 원래 질문에 추가하십시오. – Makoto

+0

감사합니다. 나 그렇게 할거야. – Rick