使用复合组合WPF

时间:2012-05-31 10:00:51

标签: wpf checkbox consuming

我希望复杂的组合框有复选框,文本,并且可能是缩略图。我已经看过以下链接,这些链接在构建复杂的组合框时帮助了我很多。

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

但是,我找不到在我的应用程序中使用这些复杂的usercontol的方法。我是WPF的新手,所以任何形式的演示支持都会受到高度赞赏。

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

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

所以问题是,我是否需要DataTable或其他东西来使用这个组合框模板绑定我的Checkbox和标题列表? 在此先感谢

3 个答案:

答案 0 :(得分:3)

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,一个可观察的Collection,它包含我们的许多dataitem,并将此集合设置为ItemsSource。从现在开始,我们的Combobox会收听对此集合的更改。就像添加和删除Employees一样,并自动将新Employee包装到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来访问数据项上的所有属性。

希望对你有所帮助。

答案 1 :(得分:1)

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

ps:请通过www阅读wpf和绑定以获取基础知识。

答案 2 :(得分:0)

你可以直接添加项目

<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