我有一个带有数据模板的列表框。数据模板非常简单,包含两个文本框。如果我在它们周围的网格上的文本框外单击,列表框将选择该行。如果我在文本框中单击,文本框将获得焦点,但列表框不会选择该行。我使用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>
答案 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,我们可以通过选择该项来设置要选择的列表框项。
不知道这对任何人都有帮助,但它在那里:)