2016-10-13 73 views
0

使用MVVM:ListViewItem的重點

<ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ... /> 

視圖模型:

public class Item: INotifyPropertyChanged { ... } 

public ObservableCollection<Item> Items { get; set; } 

public Item SelectedItem { get; set; } 

現在,如果我改變SelectedItem

// change 
Items = new ObservableCollection<Item>(...); 
SelectedItem = Items.FirstOrDefault(item => ... some condition); 
// notify view 
OnPropertyChanged(); 
OnPropertyChanged(nameof(SelectedItem)); 

當時就想項目成爲適當的選擇,但它不集中。如果我以某種方式專注於ListView,那麼使用鍵盤導航,那麼第一個項目將被選中並聚焦。

如何給SelectedItem重點?

+0

可能重複[設置關注ListBox項目打破鍵盤導航](http://stackoverflow.com/questions/2223901/setting-focus-on-a-listbox-item-breaks-keyboard-navigation) –

+0

@ MVVM'SelectedItem'中的R.Rusev不是'ListViewItem'(而是'Item')。嗯,所以基本上就是如何爲給定的'Item'獲得'ListViewItem'的問題。 – Sinatr

+1

看看http://stackoverflow.com/questions/24110679/how-to-set-focus-on-listbox-item以及 –

回答

0

ListView具有焦點時,一種可能性是自動選中焦點ListViewItem

XAML:

<ListView.ItemContainerStyle> 
    <Style TargetType="ListViewItem"> 
     <EventSetter Event="Selected" Handler="ListViewItem_Selected" /> 
    </Style> 
</ListView.ItemContainerStyle> 

視圖CS:

void ListViewItem_Selected(object sender, RoutedEventArgs e) 
{ 
    if (listView.IsFocused) 
     (e.Source as ListViewItem)?.Focus(); 
} 
1

個人而言,我更喜歡把我控制的行爲邏輯控制的代碼中。我的意思是擴展標準控制,以便以我需要的方式改變他們的行爲。

所有我需要延長ListViewItem控制的第一:

namespace Sample 
{ 
    public class ListViewItem : System.Windows.Controls.ListViewItem 
    { 
     protected override void OnSelected(RoutedEventArgs e) 
     { 
      base.OnSelected(e); 

      if (IsSelected) 
      { 
       Focus(); 
      } 
     } 
    } 
} 

然後,我需要一個ListView控制它使用我ListViewItem

namespace Sample 
{ 
    public class ListView : System.Windows.Controls.ListView 
    { 
     protected override DependencyObject GetContainerForItemOverride() 
     { 
      return new ListViewItem(); 
     } 
    } 
} 

所以我的XAML將變爲:

<local:ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ... /> 

我希望它能幫助你。

+0

這個想法很有趣。我沒有想過使用自定義控件。爲什麼在選定的事件提升器中檢查IsSelected值? – Sinatr

+0

因爲我想在當前的'ListViewItem'設置焦點,就好像它被選中一樣。否則就沒有必要(在這種情況下,其他控件將獲得焦點)。 –