选择模板控件时,带有DataTemplate的Wpf列表框不选择项目

时间:2010-12-22 14:06:00

标签: wpf wpf-controls

我有一个带有数据模板的列表框。数据模板非常简单,包含两个文本框。如果我在它们周围的网格上的文本框外单击,列表框将选择该行。如果我在文本框中单击,文本框将获得焦点,但列表框不会选择该行。我使用Expression Blend绘制模板,如果这有助于解释一些值,边距等。

以下是数据模板:

<DataTemplate DataType="{x:Type Scratch:CollectionItem}">
        <Grid Height="20" Width="288">
            <TextBox HorizontalAlignment="Left" Margin="8,0,0,0" TextWrapping="Wrap" Text="{Binding Id}" VerticalAlignment="Top" Width="86"/>
            <TextBox Margin="98,0,0,0" TextWrapping="Wrap" Text="{Binding Detail}" VerticalAlignment="Top"/>
        </Grid>
    </DataTemplate>

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

我想我会添加一个自己的答案来扩展我所学到的东西。我已经完成了上面链接答案中没有显示的内容。

所以我有一个DataTemplate:

<DataTemplate DataType="{x:Type Scratch:CollectionItem}">
    <Grid Height="20" Width="288">
    <TextBox HorizontalAlignment="Left" Margin="8,0,0,0" TextWrapping="Wrap" Text="{Binding Id}" VerticalAlignment="Top" Width="86" PreviewMouseDown="APreviewMouseDown" GotFocus="AGotFocus" GotKeyboardFocus="AGotKeyboardFocus" PreviewGotKeyboardFocus="AGotKeyboardFocus"/>
    <TextBox Margin="98,0,0,0" TextWrapping="Wrap" Text="{Binding Detail}" VerticalAlignment="Top" PreviewMouseDown="APreviewMouseDown" GotFocus="AGotFocus" GotKeyboardFocus="AGotKeyboardFocus" PreviewGotKeyboardFocus="AGotKeyboardFocus"/>
</Grid>

所有事件都发生了,我最终选择了GotFocus。 A *名称来自我试图重命名的地方,以查看事件未被解雇的原因。退出Visual Studio并重新启动似乎解决了它。这台机器不太可靠。

正如您所看到的,DataTemplate适用于CollectionItem类型的项目。我正在尝试使用INotifyPropertyChanged和Observable集合。细节并不重要。

我的ListBox绑定到{Binding Path = Items},其中Items是一个ObservableCollection

我的焦点事件是对另一个线程中找到的解决方案的变体。因为我的ListBox直接绑定到CollectionItem对象列表,所以以下工作并且看起来比处理模板化父对象更简洁。

private void AGotFocus(object sender, RoutedEventArgs e)
{
    try
    {
        FrameworkElement element = sender as FrameworkElement;
        CollectionItem item = element.DataContext as CollectionItem;
        if (item != null)
        {
            listBox2.SelectedValue = item;
        }
    }
    catch { }
}

所以在上面的例子中,sender是两个TextBox中的一个,它的DataContext指向CollectionItem,我们可以通过选择该项来设置要选择的列表框项。

不知道这对任何人都有帮助,但它在那里:)