在MVVM应用程序中,我动态地希望显示可在运行时更改的功能按钮。从技术上讲,这并不是那么困难,在我的ViewModel中,我有一个可观察到的RelayCommands集合:

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

现在,在Xaml中,我可以将ListBox绑定(bind)到此Collection:
<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>

乍一看,这似乎是可行的。
我的问题是:制表符顺序已损坏。我希望用户能够从一个按钮跳到另一个按钮,但是ListBox代替了按钮,而是吸引了用户的注意力,我可以使用箭头键而不是Tab键在按钮之间进行选择。

我需要具有绑定(bind)到集合的ListBox的功能,但不需要任何其他的listbox功能。
是否可以使用ListBox以外的其他面板?
还是我可以以某种方式禁用ListBox函数,使其仅显示所包含的项目而无法在ListBox中选择它们?

最佳答案

如果不需要任何ListBox功能,请尝试使用基本ItemsControl而不是ListBox:

<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>

关于c# - WPF MVVM : ItemTemplate for binding a list of ICommands to a ListBox,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4164487/

10-13 09:29