【问题标题】:Consuming Complex Comboboxes WPF使用复杂的组合框 WPF
【发布时间】:2012-06-05 13:54:42
【问题描述】:

我想要一个带有复选框、文本和缩略图的复杂组合框。我已经查看了以下链接,这些链接在构建复杂的组合框时帮助了我很多。

http://blogs.microsoft.co.il/blogs/justguy/archive/2009/01/19/wpf-combobox-with-checkboxes-as-items-it-will-even-update-on-the-fly.aspx

Looking for a WPF ComboBox with checkboxes

但是,我找不到在我的应用程序中使用这些复杂用户控件的方法。我是 WPF 新手,因此我们将不胜感激任何形式的演示支持。

Dean,我正在寻找一个解决方案,通过前面 SO 帖子中提到的以下示例在文件中绑定代码。

<ComboBox.ItemTemplate>
<DataTemplate>
    <StackPanel Orientation="Horizontal">
        <CheckBox IsChecked="{Binding IsSelected}"
                   Width="20" />
        <TextBlock Text="{Binding DayOfWeek}"
                   Width="100" />
    </StackPanel>
</DataTemplate>

所以问题是,我是否需要 DataTable 或其他东西来将我的复选框和标题列表与此组合框模板绑定? 提前致谢

【问题讨论】:

    标签: wpf checkbox consuming


    【解决方案1】:

    只是回答你的问题。您所需要的只是一个具有至少 2 个公共属性(IsSelected 为 bool,DayOfWeek 为字符串)的对象的集合,并将这些集合设置为 itemssource。 所以你只需要一个这样的对象的集合。如果您需要示例,请发表评论。

    ps:请通读 wpf 和绑定的 www 以获得基础知识。

    【讨论】:

      【解决方案2】:

      Combobox 是一个 ItemsControl。所有 ItemsControls 都可以用项目或容器“硬编码”填充。

      这会在组合框中添加一个新条目,并将字符串包装到一个 ItemsContainer 中,它是一个 ComboBoxItem。

      <ComboBox>
          <sys:string>Hello</string>
      <ComboBox>
      

      这里我们直接创建一个组合框项,并将其内容添加到值为“Hello”的字符串中

      <ComboBox>
          <ComboBoxItem Content="Hello"/>
      <ComboBox>
      

      两者在视觉上看起来相同。重要的是要了解,在第一种情况下,ComboBox 负责将我们的 ComboBox 未知类型字符串包装到 ComboBoxItem 中,并使用默认的 DataTemplate 来显示它。默认的 DataTemplate 将显示一个 TextBlock 并在给定的数据项上调用 ToString()。

      现在要获得动态数据,我们需要一个带有数据项的 ObservableCollection。

          class Employee
          {
              public BitmapSource Picture {get;set;}
              public string Name{get;set}
          }
      
      ObservableCollection<Employee> employees;
      myComboBox.ItemsSource = employees;
      

      我们有一个名为 Employee 的 DataClass,一个可观察的集合,其中包含我们的许多数据项,并将此集合设置为 ItemsSource。从此时起,我们的 Combobox 会监听这个集合的变化。就像添加和删除员工一样,并自动将新员工包装到 ComboBoxItem 中。一切都是自动完成的。我们唯一需要做的就是提供一个合适的 DataTemplate。组合框不知道如何“显示”员工,而这正是 DataTemplate 的用途。

      <DataTemplate x:Key="employeeTemplate">
          <StackPanel Orientation="Horizontal">
              <Image Source="{Binding Picture}"/>
              <TextBlock Text="{Binding Name}"/>
          </StackPanel>
      </DataTemplate>
      

      我们知道一个员工被包裹在一个 ComboBoxItem 中,并且 ComboBoxItem 使用提供的 Datatemplate 来显示其数据,这意味着在 DataTemplate 内部我们可以使用 Binding 来访问数据项上的所有属性。

      希望对你有所帮助。

      【讨论】:

        【解决方案3】:

        您可以简单地直接添加项目

        <ComboBox>
            <ComboBox.Items>
                <ComboBoxItem>
                    <TextBlock Text="test text" />
                </ComboBoxItem>
                <ComboBoxItem>
                    <CheckBox Content="test checkbox" />
                </ComboBoxItem>
                <ComboBoxItem>
                    <Button Content="test button" />
                </ComboBoxItem>
            </ComboBox.Items>
        </ComboBox>
        

        或者如果您想使用 ItemsSource,则需要 DataTemplateSelector

        <ComboBox>
            <ComboBox.ItemTemplateSelector>
                <local:MyCustomTemplateSelector />
            </ComboBox.ItemTemplateSelector>
        </ComboBox>
        

        这是一个解释 DataTemplateSelectors 的链接

        http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplateselector.aspx

        【讨论】:

          猜你喜欢
          • 2017-07-04
          • 2013-01-15
          • 2013-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-20
          • 1970-01-01
          • 2011-09-24
          相关资源
          最近更新 更多