34

ComboBoxのSelectedItemに問題があります。

<ComboBox Name="cbxSalesPeriods"
        ItemsSource="{Binding SalesPeriods}"
        DisplayMemberPath="displayPeriod"
        SelectedItem="{Binding SelectedSalesPeriod}"
        SelectedValuePath="displayPeriod"
        IsSynchronizedWithCurrentItem="True"/>

こちらは何でもOKです ComboBox を開くと、値が表示されます。

ここに画像の説明を入力 アイテムを選択すると、選択したアイテムが表示されません。

誰にもアイデアはありますか?

私の ViewModel には、次の 2 つのプロパティがあります。

public ObservableCollection<SalesPeriodVM> SalesPeriods { get; private set; }

private SalesPeriodVM selectedSalesPeriod;
public SalesPeriodVM SelectedSalesPeriod
{
    get { return selectedSalesPeriod; }

    set 
    {
        if (selectedSalesPeriod != value)
        {
            selectedSalesPeriod = value;
            RaisePropertyChanged("SelectedSalesPeriod");
        }
    }
}

これらはクラスのいくつかのプロパティです:

public SalesPeriodVO Vo
{
    get { return period; }
}

public int Year
{
    get { return period.Year; }
    set
    {
        if (period.Year != value)
        {
            period.Year = value;
            RaisePropertyChanged("Year");
        }
    }
}

public int Month
{
    get { return period.Month; }
    set
    {
        if (period.Month != value)
        {
            period.Month = value;
            RaisePropertyChanged("Month");
        }
    }
}

public string displayPeriod { 
    get
    {
        return this.ToString();
    }
}

public override string ToString()
{
    return String.Format("{0:D2}.{1}", Month, Year);
}

編集: プロパティ DisplayMemberPath を削除すると、次のようになります。 ここに画像の説明を入力

4

3 に答える 3

54

のプロパティを不必要に設定しているようですComboBoxDisplayMemberPath用途が異なるとSelectedValuePathプロパティを削除できます。これらのプロパティの説明については、こちらの SelectedItem、SelectedValue、および SelectedValuePath の違いの投稿をご覧になることをお勧めします。これを試して:

<ComboBox Name="cbxSalesPeriods"
    ItemsSource="{Binding SalesPeriods}"
    SelectedItem="{Binding SelectedSalesPeriod}"
    IsSynchronizedWithCurrentItem="True"/>

さらに、 WPF フレームワークは、明示的に設定されていない表示する必要があるオブジェクトに対してメソッドを自動的にdisplayPeriod呼び出すため、プロパティを使用しても意味がありません。ToStringDataTemplate


更新 >>>

あなたのコードのすべてを見ることができないので、あなたが何を間違っているのかはわかりません。代わりに、私にできることは、あなたが望むものを達成する方法の完全な実用的な例を提供することだけです. 私はそれについて何も知らないので、無意味なdisplayPeriodプロパティとあなたのSalesPeriodVOプロパティをあなたのクラスから削除しました...多分それがあなたの問題の原因ですか??. これを試して:

public class SalesPeriodV
{
    private int month, year;

    public int Year
    {
        get { return year; }
        set
        {
            if (year != value)
            {
                year = value;
                NotifyPropertyChanged("Year");
            }
        }
    }

    public int Month
    {
        get { return month; }
        set
        {
            if (month != value)
            {
                month = value;
                NotifyPropertyChanged("Month");
            }
        }
    }

    public override string ToString()
    {
        return String.Format("{0:D2}.{1}", Month, Year);
    }

    public virtual event PropertyChangedEventHandler PropertyChanged;
    protected virtual void NotifyPropertyChanged(params string[] propertyNames)
    {
        if (PropertyChanged != null)
        {
            foreach (string propertyName in propertyNames) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            PropertyChanged(this, new PropertyChangedEventArgs("HasError"));
        }
    }
}

次に、ビュー モデルに 2 つのプロパティを追加しました。

private ObservableCollection<SalesPeriodV> salesPeriods = new ObservableCollection<SalesPeriodV>();
public ObservableCollection<SalesPeriodV> SalesPeriods
{
    get { return salesPeriods; }
    set { salesPeriods = value; NotifyPropertyChanged("SalesPeriods"); }
}
private SalesPeriodV selectedItem = new SalesPeriodV();
public SalesPeriodV SelectedItem
{
    get { return selectedItem; }
    set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}

次に、コレクションを値で初期化しまし

SalesPeriods.Add(new SalesPeriodV() { Month = 3, Year = 2013 } );
SalesPeriods.Add(new SalesPeriodV() { Month = 4, Year = 2013 } );

そして、これら 2 つのプロパティのみComboBoxを にデータ バインドします。

<ComboBox ItemsSource="{Binding SalesPeriods}" SelectedItem="{Binding SelectedItem}" />

それだけです...完全に機能する例に必要なのはそれだけです。アイテムの表示は、プロパティのないメソッドから取得されていることがわかりToStringます。このコード例から間違いを解決できることを願っています。displayPeriod

于 2013-10-28T10:41:21.970 に答える