开发者

WPF MVVM: ItemTemplate for binding a list of ICommands to a ListBox

In a MVVM app I dynamically want to show buttons for functions which can be changed during runtime. Technically this ain't so difficult, in my ViewModel I've got an observablecollection of RelayCommands:

public ObservableCollection<RelayCommand> CustomCommands {get;set;}

Now in Xaml I can bind a ListBox to this Colle开发者_Go百科ction:

<StackPanel Orientation="Horizontal">
  <ListBox ItemsSource="{Binding CustomCommands}">
    <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"/>
      </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
      <DataTemplate>
        <wpfhlp:RelayButton DataContext="{Binding}"/>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</StackPanel>

At first glance this looks like it is working.

My problem is: the tabstop order is broken. I want the user to be able to jump from button to button, but instead of the button the ListBox gets the users focus, and I can select between buttons using the arrow keys instead of tab.

I need the ListBox ability to bind to a collection, but I do not need any other of the listbox functionality.

Is there some other panel instead of ListBox I can use?

Or can I somehow disable the ListBox functions so it just shows the contained items without being able to select them in the ListBox?


Try a base ItemsControl instead of a ListBox if you don't need any of the ListBox functionality:

<StackPanel Orientation="Horizontal">
  <ItemsControl ItemsSource="{Binding CustomCommands}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <wpfhlp:RelayButton DataContext="{Binding}"/>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</StackPanel>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜