如何为ItemsControl的项目编写模板

时间:2013-10-02 17:10:06

标签: .net wpf xaml

我有一个传递给页面的IEnumerable,我想在我的页面上显示这个列表,我可以简单地将列表框的ItemsSource设置为它,并显示一个字符串列表

但是我想在每个项目旁边放一个复选框,以便用这些复选框选择字符串(就像你在android中的短信中添加联系人一样)。我可以在那里放两个列表框并将它们的滚动绑定到彼此,然后将其中一个的ItemsSource设置为IEnumerable,并将复选框添加到第二个listbox foreach项目。但这很尴尬!

现在,首先哪个控件更适合这个任务ItemsControl或ListBox(我知道ListBox是一个ItemsControl)? 然后我该如何为listbox / Itemscontrol的项目编写这样的模板?

我搜索了互联网,我发现的只是datatemplates的例子!但我没有任何数据要绑定!我将IEnumerable传递给一个Page,然后我将Listbox / ItemsControl的Itemssource设置为它。我希望ItemsControl / Listbox在每个项目旁边放置一个复选框。

2 个答案:

答案 0 :(得分:1)

HierarchicalDataTemplate可能是您的答案。

我写了一个UserControl,里面只有Menu。为了模板化/设计将在运行时插入的MenuItens,我使用了上面提到的HierarchicalDataTemplate

因此,在我的<UserControl.Resources>标记内插入了以下代码。请注意,代码只是您实际可以做的迷你预览! (WPF非常可定制!)
代码:

<HierarchicalDataTemplate DataType="{x:Type ViewModel:CmpMenuViewModel}" ItemsSource="{Binding MenuSubItem}" >
        <HierarchicalDataTemplate.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Command" Value="{Binding Comando}" />
                <Setter Property="CommandParameter" Value="{Binding Texto}"/>
            </Style>
        </HierarchicalDataTemplate.ItemContainerStyle>
        <StackPanel Orientation="Horizontal">
            <Image Source="{Binding Imagem}" />
            <AccessText Text="{Binding Texto}" />
        </StackPanel>
</HierarchicalDataTemplate>

<StackPanel...位是我的实际模板 我的风格位于<HierarchicalDataTemplate.ItemContainerStyle>内。不要忘记将<Style TargetType=>更改为您的实际TargetType!

最好的问候,
蒂亚戈

答案 1 :(得分:0)

您需要将数据包装到另一个具有DataTemplate复选框的可绑定属性的类中。

例如:

<ItemsControl ItemsSource="{Binding YourList}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <CheckBox Content="{Binding TextValue}"
                IsChecked="{Binding IsChecked}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

IEnumerable中每个项目的ViewModel可能如下所示:

class Checkable : ViewModelBase {

  private bool _isChecked;
  private string _textValue;

  public bool IsChecked {
      get {
        return _isChecked;
      }
      set {
        _isChecked = value;
        OnPropertyChanged("IsChecked");
      }
    }

  public string TextValue {
      get {
        return _textValue;
      }
      set {
        _textValue = value;
      }
    }
  }

UserControl的ViewModel将具有IEnumerable,如:

public List<Checkable> YourList;

无论您使用ListBox还是ItemsControl都是您正在寻找的功能类型(我认为ItemsControl是您在这里寻找的)。