在控件模板中获取当前对象

时间:2013-10-25 08:18:17

标签: wpf listview controltemplate

<ControlTemplate TargetType="{x:Type ListBoxItem}">
                                    <StackPanel>
                                        <StackPanel Margin="0,0,28,0" Orientation="Horizontal" Visibility="{Binding IsEditable,Converter={StaticResource BooleanToVisibilityConverter}}">
                                            <TextBlock Foreground="Gray" Text="{Binding DateCreated,Converter={StaticResource DateTimeConverter}}" FontFamily="/Assets/Fonts/Berthold Akzidenz Grotesk BE Regular.ttf" FontSize="16"/>
                                            <TextBlock Text=":" Foreground="Gray"/>
                                            <TextBlock Width="20"/>
                                            <TextBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"  BorderThickness="0" Name="TrainerNoteText" Text="{Binding TrainerNote}" FontFamily="/Assets/Fonts/Berthold Akzidenz Grotesk BE Regular.ttf" Foreground="Black" FontSize="16" TextWrapping="Wrap" KeyUp="EditTrainerNote" Width="400"/>
                                        </StackPanel>
                                    </StackPanel>
                                </ControlTemplate>

以上控制模板位于列表视图中。里面的文本框是可编辑的。因此,当用户按下回车键时,我需要获取与之关联的当前对象。怎么做?

2 个答案:

答案 0 :(得分:0)

您可以在ListView级别收听KeyDown RoutedEvent。

http://msdn.microsoft.com/en-us/library/system.windows.input.keyboard.keydown.aspx

它的附加事件及其处理程序可以放在VisualTree中的任何位置。

以下是一个例子:

<StackPanel TextBox.KeyDown="OnKeyDownHandler">
  <TextBox Width="300" Height="20"/>
</StackPanel>

这是处理程序:

public void OnKeyDownHandler(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        TextBox tbx = (TextBox)sender;
        tbx.....
    }
}

答案 1 :(得分:0)

您知道,您确实应该在ListBox.ItemTemplate property DataTemplate属性中定义的ListBoxItem.Template中定义您的商品的样子。基于链接页面的示例:

<ListBox Width="400" Margin="10" ItemsSource="{Binding YourCollectionProperty}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Path=TaskName}" />
                <TextBlock Text="{Binding Path=Description}"/>
                <TextBlock Text="{Binding Path=Priority}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Binding ListBox.Items属性的集合属性时,DataTemplate内的所有UI元素都可以访问集合中类型的属性。在此示例中,填充YourCollectionProperty集合的类型中包含TaskNameDescriptionPriority属性。您可以将这些属性替换为 集合属性中的类型。

如果您设置属性以实现INotifyPropertyChanged界面(或使用DependencyProperties,那么UI元素中的任何更新都将自动在数据对象中更新查看模型/代码后面。因此,无需添加KeyDownKeyUp处理程序。有关详细信息,请阅读MSDN上的Data Binding Overview页面。