在我的测试场景中,所有组合框都显示相同的值(“< - 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" });
}
查尔斯狄更斯在这里发生了什么猪肉链接???
答案 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)
使用组合框的Array
或List
:
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))));