gpt4 book ai didi

c# - 在 Tab 键按下时将新项​​目添加到列表框

转载 作者:行者123 更新时间:2023-11-30 18:00:00 25 4
gpt4 key购买 nike

我有一个 WPF ListBox,带有一个用于 ListBox ItemTemplate 的自定义 DataTemplate(每个项目都有一组控件;即文本框和日期选择器)。我有一个附加到最后一个 DatePicker 的行为,它允许用户在 PreviewKeyDown 事件的事件处理程序中执行 ICommand。

想法是,用户将通过 ListBoxItem 中的控件使用 TAB 键,当他们到达最后一个控件并再次按下 TAB 键时,一个新的 ListBoxItem 将添加到 ListBox 中。然后焦点将移动到下一个 ListBoxItem 中的第一个控件。当 ListBox 中已有 2 个项目并且您正在通过第一个项目切换时,我的解决方案工作正常。如果 ListBox 中只有 1 个项目,而您到达最后一个控件,则会添加新的 ListBoxItem(如预期的那样),但焦点会越过 ListBox 移至下一个父控件。

这就像行为代码被调用并且 ICommand 被调用,但 TAB 事件继续进行而不等待新的 ListBoxItem 被添加。

有什么建议吗?

我的行为(ZBehaviorBase 只是一个允许“更好”清理的类):

public class TabOffCommandBehavior : ZBehaviorBase<FrameworkElement>
{
public ICommand TabCommand
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}

public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("TabCommand", typeof(ICommand), typeof(TabOffCommandBehavior));

protected override void Initialize()
{
this.AssociatedObject.PreviewKeyDown += new KeyEventHandler(AssociatedObject_PreviewKeyDown);
}

protected override void Uninitialize()
{
if (this.AssociatedObject != null)
{
this.AssociatedObject.PreviewKeyDown -= new KeyEventHandler(AssociatedObject_PreviewKeyDown);
}
}

void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e)
{
// if you want to pass a command param to CanExecute, need to add another dependency property to bind to
if (TabCommand != null && e.Key == Key.Tab && TabCommand.CanExecute(null))
{
TabCommand.Execute(null);
}
}

XAML:

<ListBox Grid.Row="1" KeyboardNavigation.TabNavigation="Continue" ItemsSource="{Binding Path=OrderLines, Mode=OneWay}" 
ItemTemplate="{DynamicResource LineTemplate}" SelectionMode="Extended">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Margin" Value="0,5,0,5"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Template" Value="{DynamicResource ListBoxItemTemplate}"/>
<Setter Property="IsEnabled" Value="{Binding Path=IsLocked, Converter={StaticResource NotBoolConverter}}"/>
<Setter Property="IsSelected" Value="{Binding Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>

在“LineTemplate”内部:

<TextBox Grid.Column="9" Grid.Row="3" Text="{Binding Path=SellPriceOverride, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" VerticalAlignment="Center" Margin="5,0" TabIndex="10">
<!--IF ANOTHER INTERACTIVE CONTROL IS ADDED PAST THIS ONE ON THE LINE, THIS COMMENT AND THE BEHAVIOR MUST BE MOVED TO THAT CONTROL INSTEAD-->
<e:Interaction.Behaviors>
<ZViewModels:TabOffCommandBehavior TabCommand="{Binding Path=DataContext.AddNewOrderLine, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"/>
</e:Interaction.Behaviors>
</TextBox>

在命令的“Execute”方法中唯一完成的事情是将对象添加到集合中,该集合是 ListBox 的 ItemsSource

最佳答案

在您的 AddNewOrderLine 方法中,尝试将焦点设置在您添加的新项目上。然后为防止焦点改变,修改如下代码:

void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e)
{
// if you want to pass a command param to CanExecute, need to add another dependency property to bind to
if (TabCommand != null && e.Key == Key.Tab && TabCommand.CanExecute(null))
{
TabCommand.Execute(null);
e.Handled = true;
}
}

关于c# - 在 Tab 键按下时将新项​​目添加到列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10589228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com