WPF Combobox具有不同的选定项目和文本

时间:2016-04-18 13:18:19

标签: c# wpf combobox

我陷入了这个问题。我的应用程序中有一个组合框(用代码创建,而不是XAML);我用复选框填充它,因为我需要一个带有复选框的下拉控件。

现在,我不需要组合框选择,因为它没有意义。所以我想在控件的文本部分显示一个标签。

有办法做到这一点吗?这是一个最小的例子:

myComboBox = new System.Windows.Controls.ComboBox();

foreach (var key in myDictionary.Keys)
{
    System.Windows.Controls.CheckBox chk = new System.Windows.Controls.CheckBox();
    chk.Content = key;
    chk.SetBinding(System.Windows.Controls.CheckBox.IsCheckedProperty, new Binding() { Mode = BindingMode.TwoWay, Source = this, Path = new PropertyPath("myDictionary[" + key + "]") });

    RoutedEventHandler ev = (sender, e) =>
    {
        // Do something when a checkbox is changed
    };
    chk.Checked += ev;
    chk.Unchecked += ev;

    myComboBox.Items.Add(chk);
}

这样,如果用户点击复选框,则复选框内容会显示在文本字段中。

我修改了它还添加了

myComboBox.SelectionChanged += (sender, jender) =>
{
    myComboBox.SelectedItem = null;
};

这样就不会显示任何文字。但是..如果我想在组合框的文本部分内写一个固定的字符串怎么办?

谢谢

1 个答案:

答案 0 :(得分:1)

哇,这是一个真正的痛苦。我认为这很简单,但事实证明它并非如此。我假设您可以为组合框中显示的内容设置模板,并分别为下拉列表中显示的内容设置模板。您可以,但必须使用内容选择器:

How to display a different value for dropdown list values/selected item in a WPF ComboBox?

这是正确的做法。但是,您只是想要显示一个直接的静态标签/字符串吗?如果是这样的话,可能会更加容易地覆盖你已经在这样的网格中得到的东西:

    <Grid>
        <ComboBox x:Name="Checkbox" SelectionChanged="Checkbox_SelectionChanged">
            <ComboBox.Items>
                <CheckBox Content="Test1"/>
                <CheckBox Content="Test2"/>
                <CheckBox Content="Test3"/>
            </ComboBox.Items>
        </ComboBox>
        <TextBlock IsHitTestVisible="False" Text="My Text" VerticalAlignment="Center" Margin="5"/>
    </Grid>

将文本块设置为hit-tests不可见意味着它们只是传递给组合框:

enter image description here