为什么这个“显然”错误的情况会恢复正常?

时间:2012-07-14 23:45:45

标签: c# wpf boolean

在我的测试场景中,所有组合框都显示相同的值(“< - 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" });
}

查尔斯狄更斯在这里发生了什么猪肉链接???

8 个答案:

答案 0 :(得分:3)

如果您的示例是Winforms示例,SelectedValue是一个对象,其中包含ValueMember属性指定的数据源成员的值。如果您没有ValueMember Assigned,请使用SelectedItem属性。


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

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;
} 

答案 1 :(得分:3)

SelectedValue返回object。很可能至少有一个涉及的字符串未被实现,导致object比较(总是参考比较)返回false。

答案 2 :(得分:2)

修改:按照我的想法,您手动创建ListBoxItems ...

所选值为ListBoxItem,当然不等于string,将SelectedValuePath设置为"Content"或只删除ListBoxItems和直接添加字符串,控件将为您创建容器(这通常是首选,数据集合中不应包含UI元素,它也允许虚拟化)


  

所有组合框都显示相同的值(“&lt; - Select - &gt;”)。

显示!=值,有一些属性可以定义显示的内容和选择的内容。 例如如果你有数据库条目,你可能希望SelectedValue是主键(这是一个整数),所以你相应地设置SelectedValuePath,但是对于用户来说数字没什么意义所以你设置{ {3}}包含有意义的名称或描述的某个属性。

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

答案 3 :(得分: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#中,“==”比较更类似于测试两个对象是否是同一个实例,这是你很少会做的事情(在你的例子中显然不是你想要的)。 / p>

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

答案 4 :(得分: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));

答案 5 :(得分:1)

  

查尔斯狄更斯在这里发生了什么猪肉链接???

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

逐步调试调试器中的代码,或打印出值。

答案 6 :(得分:1)

尝试SelectedItem而不是SelectedValue

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

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

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

答案 7 :(得分:-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))));