我使用TabControl显示项目列表。 ItemView是我写的一个单独的控件。
<TabControl SelectedItem="{Binding CurrentItem}"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding ItemList}">
<TabControl.ContentTemplate>
<DataTemplate>
<ctrls:ItemView/>
</DataTemplate>
</TabControl.ContentTemplate>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ShortItemDescription}"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
如果用户按下按钮,则会将新的ViewModel添加到ViewModel列表中,TabControl会将其显示为新选项卡。添加新标签后,选择了。
<Button Command="{Binding AddItemCommand}"
Content="Add item"/>
新视图内部是每次添加新标签时都需要聚焦的按钮。我试图在ItemView中使用FocusManager和Initialized事件,但这些仅在我第一次添加新标签时被调用。
<UserControl x:Class="ItemView"
...
Initialized="ViewInitialized">
<Grid>
...
<!-- Set focus to this button -->
<Button Content="Search"
Command="{Binding SearchCommand}"
Name="SearchButton"
Grid.Column="0"
Grid.Row="0"/>
</Grid>
</UserControl>
有什么想法吗?
更新
ItemView中Initialize方法的内容目前是这个 - 这是第一次工作正常...... 然后再也没有
public delegate void ChangeFocusDelegate();
private void FocusSearchButton()
{
SearchButton.Focus();
}
private void ViewInitialized(object sender, EventArgs e)
{
ChangeFocusDelegate focusDelegate = FocusSearchButton;
Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, focusDelegate);
}
答案 0 :(得分:1)
这应该是这样的(在你定义的UserControl的Initialized事件上):
private void ViewInitialized(object sender, System.EventArgs e)
{
this.SearchButton.Focus();
}
答案 1 :(得分:0)
您需要在视图上订阅Loaded事件,并在事件处理程序方法中调用按钮上的Focus()。
答案 2 :(得分:0)
然后我得到了解决方案。如果运行时为每个选项卡使用相同的View并仅将内部数据更改为另一个ViewModel,该怎么办?所以解决方案是:
private void SameViewButDataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
ChangeFocusDelegate focusDelegate = FocusFileSearchButton;
Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, focusDelegate);
}
每次添加标签时,焦点都会切换到“搜索”按钮。