以下是我的用戶界面截圖。 如何強制將焦點放入ItemsControl的項目中?
一切的束縛質疑的對象的列表:
class Question
{
public Answer[] Answers { get; set; }
public string Text { get; set; }
}
class Answer
{
public bool IsSelected { get; set; }
public string Text { get; set; }
}
這對我正在寫一個朋友的例子,我仍然是一個相對MVVM新手。 (我知道這是「不對的」,以對回答這樣一個IsSelected UI的概念,但它的作品沒有混淆的朋友。)
反正左側顯然與集合作爲其項目源的列表框。右側是跟這個有ContentPresenter剪斷的DataTemplate:
<DataTemplate x:Key="question" DataType="{x:Type local:Question}">
<Grid>
<Grid.RowDefinitions> ... </Grid.RowDefinitions>
<TextBlock Text="{Binding Text}" />
<ItemsControl Grid.Row="1"
ItemsSource="{Binding Answers}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding Text}"
GroupName="Answer"
IsChecked="{Binding IsSelected}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</DataTemplate>
我得設置,使PageUp鍵和PageDown通過提問移動輸入綁定。當問題發生變化時,我希望右側的一個單選按鈕(最好是所選的一個,如果有的話)進行聚焦。目標是讓用戶使用向上/向下箭頭鍵選擇答案,並使用PageUp/PageDown在問題之間移動。
我可以標籤到單選按鈕和箭頭鍵的工作,但是當我推空間來選擇答案焦點移回到列表框。老實說,我可以在沒有列表框的情況下完成工作。將Focusable設置爲false似乎將我的注意力集中在單選按鈕中,但即使將IsTabStop設置爲False,Tab鍵仍然可以在列表框中獲得焦點。
在壞舊的WinForms,我不得不爲找到的第一個單選按鈕,並集中了,與的GotFocus處理一起,試圖扔掉焦點就像一個燙手的山芋列表框中的SelectedIndexChanged處理程序。由於單選按鈕是模板的一部分,因此我沒有看到清晰或優雅的路徑。我怎樣才能得到我想要的行爲? 「重新設計你的用戶界面」是一個可以接受的答案,如果它完成了這項工作,但我希望能用最少的代碼隱藏解決方案;它讓我想起了太多的WinForms。
我不看看這將如何幫助。爲了使用該技術,我需要訪問該元素。我沒有訪問權限,因爲它是由DataTemplate生成的。我錯過了什麼。 – OwenP
你可以嘗試集中Grid.Row – Yahia
另一種方式來做到這一點使用請參閱http://stackoverflow.com/questions/570194/focus-datatemplate-in-wpf/582843#582843 – Yahia