【问题标题】:WPF Combobox with different selected item and text具有不同选定项目和文本的 WPF 组合框
【发布时间】:2016-08-10 06:14:33
【问题描述】:

我陷入了这个问题。我的应用程序中有一个组合框(用代码创建,而不是 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;
};

这种方式永远不会显示任何文本。但是..如果我想在组合框的文本部分内写一个固定的字符串呢?

谢谢

【问题讨论】:

  • 您考虑过使用 WPF 工具包吗?他们有一个正是您所描述的控件:wpftoolkit.codeplex.com/wikipage?title=CheckComboBox 否则,您可以使用 ItemTemplate 我相信。
  • @Joe 感谢您的评论。无论如何,我从未考虑过 WPF 工具包;谢谢。但是,该控件将复选框内容连接在一起;我需要一个固定的字符串来代替复选框内容..
  • 啊,抱歉,我以为那是你想要的。

标签: c# wpf combobox


【解决方案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>

将文本块设置为对命中测试不可见意味着它们只是传递给组合框:

【讨论】:

  • 感谢您的帮助。这是我尝试过的另一个解决方案,但不知道命中测试,所以我放弃了它;)最后我想在组合框中添加另一个元素(myComboBox.Items.Add("My Text");foreach 之前)。它显示另一个元素,但由于它的颜色不同,它看起来像一个标题......无论如何我会记住这个解决方案
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 2010-12-31
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多