0

まず、私のコードがどのようにカットされているかをお見せしましょう。

xaml UC (eventsUC.xaml) にこのコードがあります:

<UserControl x:Class="QuimeO.UserControls.Lists.EventsListUC"
         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" 
         xmlns:ToggleSwitch="clr-namespace:ToggleSwitch;assembly=ToggleSwitch" 
         mc:Ignorable="d" 
         Width="477"
         >
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <ScrollViewer HorizontalScrollBarVisibility="Disabled" Width="auto" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <ItemsControl Grid.Row="0" BorderThickness="0" x:Name="eventsList" ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ItemsControl.Resources>
                <ResourceDictionary x:Name="eventslisttempplate" Source="EventsListTemplate.xaml"  />
            </ItemsControl.Resources>
        </ItemsControl>
    </ScrollViewer>...

私の EventsListTemplate.xaml は次のようになります。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Class="QuimeO.UserControls.Lists.EventsListTemplate"
                    xmlns:apiNamespace="clr-namespace:QuimeO.DBO"
                    >
    <DataTemplate DataType="{x:Type apiNamespace:EventsDictionary}">
        <StackPanel Orientation="Vertical">
            <Border BorderBrush="LightGray" BorderThickness="0,0,0,1" Margin="0,5,0,0">
                <TextBlock HorizontalAlignment="Right" Foreground="Gray" Text="{Binding FormatedDate}" FontSize="14"></TextBlock>
            </Border>
            <ListView Grid.Row="0" x:Name="eventsList" ItemsSource="{Binding Events}" BorderThickness="0" MouseDoubleClick="eventsList_MouseDoubleClick">
            </ListView>
        </StackPanel>
    </DataTemplate>
</ResourceDictionary>

そして、私の EventsListTemplate.xaml.cs コードビハインドは次のようになります

public partial class EventsListTemplate : ResourceDictionary
    {
        public Delegate MainWindowControlPointer;

        private void eventsList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var ev = ((sender as ListView).SelectedItem as ListViewItem).DataContext as Event;
            System.Diagnostics.Debug.WriteLine(ev.Name);

            this.MainWindowControlPointer.DynamicInvoke(ev.Ancestors.Root, new Element() { Category = ev.Category, Id = ev.Id, Name = ev.Name });
        }
    }

テンプレートでリストビューの項目をクリックすると、eventsList_MouseDoubleCkick がトリガーされ、イベントを取得できます。

ただし、テンプレートが作成される UC でアクションをトリガーしたいと考えています (最初のソース コード ブロック)。

そのためには、テンプレートでデリゲートを作成するだけです (技術的には、完璧な世界では、"this.rd_eventslisttemplate.MainWindowControlPointer = ..." のようなものです)。しかし、それを行う方法や、これが可能かどうかはわかりません。

4

1 に答える 1

1

あなたの質問をしばらく暗号化した後、私はそれを理解したと思います。

VisualTree のコントロールの親を取得する VisualTreeHelper.GetParent() という便利なメソッドがあります。

EventsListTemplate でイベントをキャッチするときに問題が発生すると、最終的に UserControl のインスタンスを取得するまで、GetParent() を数回呼び出す必要があります。

それでおしまい。

于 2013-09-30T12:01:30.927 に答える