私はオブジェクトのコレクションにバインドされたComboBoxを持っています。オブジェクトには、オブジェクトが現在コンボボックステキスト領域に表示されるように選択されているかどうかを指定するプロパティboolean IsSelectedがあります。ComboBox、WPFの新機能
ComboBoxにデフォルトのアイテムを表示するためにIsSelectedブール値プロパティを使用するために、以下のようなValueConverterクラスを追加しました。
public class SelectedItemConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null && value is IEnumerable<Car>)
{
return ((IEnumerable<Car>)value).Where(n => n.IsSelected).FirstOrDefault();
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null && value is Car)
{
return value;
}
return null;
}
}
私のコンボボックスはUserContrlであり、そのXAMLは次のとおりです。私の車のオブジェクトがブール値であるIsSelectedを持っており、それは車がコンボボックスのテキスト領域に表示されているかどうかを表しているので、私はのSelectedItemを使用しています
<ComboBox ItemsSource="{Binding CarsList}"
SelectedItem="{Binding CarsList, Converter={StaticResource selectedItemConverter}}"
DisplayMemberPath="Name">
</ComboBox>
。そのため、上記のValueConverterを使用してオブジェクトを適切に返すようにします。
これは正常に動作し、ComboBoxが読み込まれると、IsSelected = Trueのオブジェクトがコンボボックスのテキスト領域に表示されます。しかし、ドロップダウンを展開して別のオブジェクトを選択すると、そのオブジェクトが表示されますが、ComboBoxは赤枠線を取得します。これは私が知る限り、いくつかの検証の問題があることを意味します。
これを修正するにはどうすればよいですか?
私は多くの例を見てきましたが、ブール型プロパティIsSelectedを使用してComboBoxに表示するオブジェクトを決定する問題は解決していません。
どうすれば解決できますか?
おそらく問題は 'ConvertBack'機能である、それは' IEnumerableを CarsList'を返す必要があります。とにかく、あなたはその方法で 'SelectedItem'への束縛を再考するべきだと思います。 –
bars222
あなたは正しい、ConvertBackはCarインスタンスを返していて、CarListインスタンスは返していません。しかし、問題は、ConvertBackに渡されないCarListインスタンスがないことです。どのようにそれを返すようにするか分からない。 – pixel
私は@Boluがバインディングを変更する良い方法を提案したと思います。そうでなければ 'CarList'を' ConverterParameter'として渡すことができます(もし 'CarList'コレクションが決してあなたがリソースのようなxamlでそれを定義することができます)が、これは奇妙な複雑な方法です。 – bars222