2011-08-07 45 views
1

以下是我的用戶界面截圖。 enter image description here如何強制將焦點放入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。

回答

0
+0

我不看看這將如何幫助。爲了使用該技術,我需要訪問該元素。我沒有訪問權限,因爲它是由DataTemplate生成的。我錯過了什麼。 – OwenP

+0

你可以嘗試集中Grid.Row – Yahia

+0

另一種方式來做到這一點使用請參閱http://stackoverflow.com/questions/570194/focus-datatemplate-in-wpf/582843#582843 – Yahia

0

我知道你說你不想來設計UI,但你可以做一個列表框看起來像一個單選按鈕列表。不確定一個WPF列表框會做你想做的事情,但它佔用不同的焦點,你可以設置SelectedIndex屬性。

0

有些事情,你可以這樣做:

<RadioButton ... 
      Loaded="RBAnswer_Loaded"/> 
private void RBAnswer_Loaded(object sender, RoutedEventArgs e) 
{ 
    var rb = (RadioButton)sender; 
    var answer = (Answer)rb.DataContext; 
    if (answer.IsSelected) rb.Focus(); 
} 

(爲了擺脫代碼後面,你可以使用類似交融互動的InvokeCommandAction封裝在一個命令)

相關問題