-2

在我的测试场景中,所有组合框都显示相同的值(“<--Select-->”)。

private bool AtLeastOnePlatypusSelected()
{
    string DefaultPlatypusValue = "<--Select-->";
    return (cmbxWeek1.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek2.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek3.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek4.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek5.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek6.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek7.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek8.SelectedValue != DefaultPlatypusValue) ||
           (cmbxWeek9.SelectedValue != DefaultPlatypusValue);
}

...但是这个函数正在返回 true。

这是另一个组合框代码:

public ObservableCollection<ComboBoxItem> cbItems { get; set; }
public ComboBoxItem SelectedcbItem { get; set; }
private Dictionary<int, int> PointNumToWeekNumPairings = new Dictionary<int, int>();

public MainWindow()
{
    InitializeComponent();
    DataContext = this;

    cbItems = new ObservableCollection<ComboBoxItem>();
    var cbItem = new ComboBoxItem { Content = "<--Select-->" };
    SelectedcbItem = cbItem;
    cbItems.Add(cbItem);
    cbItems.Add(new ComboBoxItem { Content = "Tony Iommi" });
    cbItems.Add(new ComboBoxItem { Content = "Mike McCarthy" });
    cbItems.Add(new ComboBoxItem { Content = "Micah Profit" });
    cbItems.Add(new ComboBoxItem { Content = "Allan Poe" });
    cbItems.Add(new ComboBoxItem { Content = "Bill Bailey" });
    cbItems.Add(new ComboBoxItem { Content = "Duane Eddy" });
    cbItems.Add(new ComboBoxItem { Content = "John Kennedy" });
    cbItems.Add(new ComboBoxItem { Content = "Bert Erneson" });
    cbItems.Add(new ComboBoxItem { Content = "Clyde Valouch" });
    cbItems.Add(new ComboBoxItem { Content = "Micky Thompson" });
}

Pork Link Wray 查尔斯狄更斯在这里发生了什么?!?

4

8 回答 8

3

如果您的示例是 Winforms 示例,SelectedValue则对象是包含由 ValueMember 属性指定的数据源成员的值。如果您没有分配 ValueMember,请改用该SelectedItem属性。


请注意,WPF 中的 SelectedValue 属性和 SelectedItem 属性返回 ComboBoxItem 对象,因此您将 aComboBoxItem与字符串进行比较。尝试将您的比较更改为以下内容:

private bool AtLeastOnePlatypusSelected()
{

    string DefaultPlatypusValue = "<--Select-->";
    return (string)((ComboBoxItem)cmbxWeek1.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek2.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek3.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek4.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek5.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek6.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek7.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek8.SelectedValue).Content != DefaultPlatypusValue ||
           (string)((ComboBoxItem)cmbxWeek9.SelectedValue).Content != DefaultPlatypusValue;
} 
于 2012-07-15T00:03:21.770 回答
3

SelectedValue返回一个object. 很可能至少有一个涉及的字符串没有被保留,导致object比较(始终是参考比较)返回 false。

于 2012-07-15T00:09:54.380 回答
2

编辑:正如我所想,您手动创建ListBoxItems...

选择的值是 a ListBoxItem,当然不等于 a string,设置SelectedValuePath"Content"或者直接删除ListBoxItems并添加字符串,控件会为你创建容器(这通常是首选,不应该有 UI 元素数据收集,它还允许虚拟化)


所有组合框都显示相同的值(“<--Select-->”)。

Display != value,有一些属性定义了显示的内容和选择的内容。例如,如果您有数据库条目,您可能希望SelectedValue成为主键(它是某个整数),因此您可以SelectedValuePath相应地设置,但对用户而言,数字没有任何意义,因此您将 设置为DisplayMemberPath包含有意义名称或描述的某个属性。

检查这些属性的设置(如果没有SelectedValuePath,它将是完整的项目,即SelectedValue == SelectedItem)。此外,如果您的所有条目都包含在手动创建中,ListBoxItems那么您当然会得到ListBoxItem != string.

于 2012-07-15T00:08:33.907 回答
1

试试这个:

private bool AtLeastOnePlatypusSelected()
{
    string DefaultPlatypusValue = "<--Select-->";
    return (!cmbxWeek1.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek2.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek3.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek4.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek5.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek6.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek7.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek8.SelectedValue.Equals(DefaultPlatypusValue) ||
       (cmbxWeek9.SelectedValue.Equals(DefaultPlatypusValue));
}

通常,您希望使用“Equals”方法来测试两个对象的“相等性”。

在 C# 中,“==”比较更类似于测试两个对象是否是同一个实例,这是您很少会做的事情(在您的示例中,显然不是您想要的)。

编辑:事实证明,C# 中的字符串不是这种情况。

于 2012-07-14T23:50:16.553 回答
1

使用ArrayList组合框:

var cmbxWeeks = new List<ComboBox>();
cmbxWeeks.Add(cmbxWeek1 ...

private bool AtLeastOnePlatypusSelected()
{
    string DefaultPlatypusValue = "<--Select-->";

    bool result = true;
    foreach (var cmbxWeek in cmbxWeeks)
        result = result  || (cmbxWeek.SelectedValue != DefaultPlatypusValue);

    return result;
}

或以 LINQ 方式

return cmbxWeeks.Aggregate(true, (current, cmbxWeek) => current || ((string) cmbxWeek.SelectedValue != DefaultPlatypusValue));
于 2012-07-14T23:55:02.873 回答
1

Pork Link Wray 查尔斯狄更斯在这里发生了什么?!?

显然,一个或多个组合框SelectedValue与您预期的不同。

在调试器中单步执行代码,或打印出值。

于 2012-07-14T23:56:25.260 回答
1

尝试 SelectedItem 而不是 SelectedValue

我写了一个快速的小测试程序,发现我的组合框的 SelectedValue 等于 null,但 SelectedItem 有我期望的文本并返回 false。

(我很抱歉,我的测试是在 WinForms 中......)

好的,我的测试表明 SelectionBoxItem 将返回字符串,并且应该为您提供所需的结果。

于 2012-07-15T00:04:59.890 回答
-1

我必须将代码更改为此才能工作:

return ((!(cmbxWeek1.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek2.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek3.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek4.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek5.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek6.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek7.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek8.SelectedValue.ToString().Contains(DefaultPlatypusValue))) ||
        (!(cmbxWeek9.SelectedValue.ToString().Contains(DefaultPlatypusValue))));
于 2012-07-15T00:24:01.190 回答