Wpf使用DataTemplate的listbox,在选择模板控件时无法选择项目

4
我有一个带有数据模板的列表框。数据模板非常简单,包含两个文本框。如果我在文本框外的网格上点击,列表框会选择行。如果我在文本框内点击,文本框会获得焦点,但列表框不会选择该行。如果需要解释一些值,如Margin等,请注意我使用了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个回答

3

我在这里显然漏掉了什么。我已经在每个文本框中添加了PreviewMouseDown="PreviewMouseDown" GotFocus="GotFocus",但是事件从未被触发。GotFocus和PreviewMouseDown作为Window上的方法存在。有什么想法吗? - Ian
不用理会,我关闭了Visual Studio并重新打开它,然后一切都开始正常工作了 :/ - Ian

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

我的Got Focus事件变体基于在其他线程中找到的解决方案。因为我的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 { }
}

所以在上面的情况中,发送者是两个文本框之一,它的数据上下文指向一个CollectionItem,我们可以通过选择该项来设置列表框项目为选定状态。

不知道这是否对任何人有帮助,但它已经存在 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接