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

ポークリンクレイチャールズディケンズはここで何が起こっているのですか?!?

4

8 に答える 8

3

例がWinformsの例である場合、SelectedValueはValueMemberプロパティで指定されたデータソースのメンバーの値を含むオブジェクトです。ValueMemberが割り当てられていない場合は、SelectedItem代わりにプロパティを使用してください。


WPFのSelectedValueプロパティとSelectedItemプロパティはComboBoxItemオブジェクトを返すためComboBoxItem、を文字列と比較していることに注意してください。比較を次のようなものに変更してみてください。

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。関連する文字列の少なくとも1つがインターンされていない可能性が非常に高く、object比較(常に参照比較)がfalseを返します。

于 2012-07-15T00:09:54.380 に答える
2

編集:私が思ったように、あなたは手動で作成しますListBoxItems...

選択された値は、ListBoxItemもちろん、と等しくありませんstring。に設定SelectedValuePathする"Content"か、単にドロップしListBoxItemsて文字列を直接追加すると、コントロールがコンテナを作成します(これは通常推奨されますが、UI要素を含めるべきではありません)データ収集、それはまた仮想化を可能にします)


すべてのコンボボックスに同じ値が表示されます( "<-Select->")。

!= 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」メソッドを使用して、2つのオブジェクトの「equality」をテストする必要があります。

C#では、 "=="の比較は、2つのオブジェクトが同じインスタンスであるかどうかをテストすることに似ています。これは、めったに行わないことです(この例では、明らかに必要なことではありません)。

編集:つまり、これはC#の文字列には当てはまりません。

于 2012-07-14T23:50:16.553 に答える
1

ArrayまたはListComboBoxの使用:

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

ポークリンクレイチャールズディケンズはここで何が起こっているのですか?!?

明らかに、1つ以上のコンボボックスはSelectedValue予想とは異なります。

デバッガーでコードをステップ実行するか、値を出力します。

于 2012-07-14T23:56:25.260 に答える
1

SelectedValueではなくSelectedItemを試してください

簡単な小さなテストプログラムを作成し、コンボボックスのSelectedValueがnullに等しいことを発見しましたが、SelectedItemに期待したテキストがあり、falseを返しました。

(申し訳ありませんが、私のテストはWinFormsで行われました...)

OK、私の新しいテストは、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 に答える