ビューとビューモデルの間で双方向にバインドする ComboBox が wpf にあります。win7 の .net 4 で実行すると、すべてが期待どおりに動作しましたが、Windows 8 でアプリケーションを実行すると、コンボボックスがビューモデルから正しい選択項目を取得できないようです。
ビューに入ると、コンボボックスはビューモデルから選択されたアイテムを要求します
。選択されたアイテムが返され、「Equals」をオーバーライドする私のメソッドはtrueを返します。
ビューのコンボボックスは、これを登録しないか、登録してから無視し、次に発生するのは、ビューがビューモデルの「選択された項目」を「NULL」に設定することです。
要件を達成できる別の方法はありますか、それとも.net 4.5の下で.net 4アプリを実行する際の単なるバグですか?
これがソースです。注: 列挙型ではなくアイテム クラスに直接バインドするので、[Description] タグにアクセスして、コンボ ボックス内のより適切なアイテム名を取得できます。
意見
<Controls:KNComboBox Style="{DynamicResource FlowMenuComboBox}" SelectedItem="{Binding ItemsOrder}" ItemsSource="{Binding ItemsOrderValues}" Margin="10,0,0,10"
DisplayMemberPath="Description" SelectedValuePath="{Binding Path=EnumObject}" DisplayString="Sort By:"/>
モデルを見る
private ItemsOrderByItem _itemsOrder;
public ItemsOrderByItem ItemsOrder
{
get
{
return _itemsOrder;
}
set
{
_itemsOrder = value;
RaisePropertyChanged("ItemsOrder");
//Methods Called Here Not Important To Question
}
}
public List<ItemsOrderByItem> ItemsOrderValues
{
get
{
List<ItemsOrderByItem> enumItems = new List<ItemsOrderByItem>();
foreach (ItemsOrderBy enumValue in Enum.GetValues(typeof(ItemsOrderBy)))
{
enumItems.Add(new ItemsOrderByItem(enumValue));
}
return enumItems;
}
}
列挙型
public enum ItemsOrderBy
{
[Description("Name")]
Name,
[Description("Date Added")]
DateAdded
}
アイテム クラス
public class ItemsOrderByItem
{
public ItemsOrderByItem(ItemsOrderBy enumValue)
{
EnumObject = enumValue;
}
public ItemsOrderBy EnumObject;
public string Description
{
get
{
return EnumExtension.GetEnumDescription<ItemsOrderBy>(EnumObject);
}
}
public override string ToString()
{
return Description;
}
public override bool Equals(object obj)
{
if (obj is ItemsOrderByItem)
{
return ((ItemsOrderByItem)obj).EnumObject == EnumObject;
}
else
{
return false;
}
}
}