36

我的谷歌技能让我失望。任何人都听说过类似 WPF 的控件。我试图让它看起来像这样(winforms screenshot)。

4

3 回答 3

62

您可以通过设置组合框的 DataTemplate 自己完成此操作。本文向您展示了如何 - 对于列表框,但原理是相同的。


这里的另一篇文章可能更适合您尝试做的事情,只需将项目模板的第一列设置为复选框并将其绑定到业务对象上的布尔值。

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding IsSelected}"
                       Width="20" />
            <TextBlock Text="{Binding DayOfWeek}"
                       Width="100" />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>
于 2009-05-13T17:29:35.830 回答
22

有我的组合框。我使用此链接中的 Martin Harris 代码和代码Can a WPF ComboBox 在其选择为空时显示替代文本?

<ComboBox Name="cbObjects" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="2,2,6,0" SelectionChanged="OnCbObjectsSelectionChanged" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected}" Width="20" VerticalAlignment="Center" Checked="OnCbObjectCheckBoxChecked" Unchecked="OnCbObjectCheckBoxChecked" />
                <TextBlock Text="{Binding ObjectData}" VerticalAlignment="Center" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
<TextBlock IsHitTestVisible="False" Name="tbObjects" Text="Выберите объекты..." Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="6,2,6,0" />

数据源小类:

public class SelectableObject <T> {
    public bool IsSelected { get; set; }
    public T ObjectData { get; set; }

    public SelectableObject(T objectData) {
        ObjectData = objectData;
    }

    public SelectableObject(T objectData, bool isSelected) {
        IsSelected = isSelected;
        ObjectData = objectData;
    }
}

并且有两个处理程序 - 一个用于处理单击的 CheckBox,一个用于为 ComboBox 形成文本。

private void OnCbObjectCheckBoxChecked(object sender, RoutedEventArgs e) {
    StringBuilder sb = new StringBuilder();
    foreach (SelectableObject<tblObject> cbObject in cbObjects.Items) 
    {
        if (cbObject.IsSelected)
            sb.AppendFormat("{0}, ", cbObject.ObjectData.Description);
    }
    tbObjects.Text = sb.ToString().Trim().TrimEnd(',');
}

private void OnCbObjectsSelectionChanged(object sender, SelectionChangedEventArgs e) {
    ComboBox comboBox = (ComboBox)sender;
    comboBox.SelectedItem = null;
}

对于 ComboBox.ItemsSource 我使用

ObservableCollection<SelectableObject<tblObject>> 

其中 tblObject 是我的对象的类型,我想在 ComboBox 中显示它的列表。

我希望这段代码对某人有用!

于 2011-07-07T06:28:08.640 回答
9

尝试使用Extended WPF Toolkit中的CheckComboBox。对我来说主要优势是有两个绑定列表:

  • 所有可供选择的项目
  • 刚刚选择的项目

我觉得这种方法更实用。此外,您可以指定要绑定的集合valuedisplay成员。

如果你不想带一堆其他的控件CheckComboBox,你可以获取它的源代码,它非常简单(需要带Selector 类)。

于 2015-03-05T05:44:33.570 回答