我的WPF窗口中有这个组合框。
<ComboBox DisplayMemberPath="Description" SelectedValuePath="ID" ItemsSource="{Binding Source={StaticResource CvsPrinters}}" SelectedValue="{Binding CheckPrinterID}" />
我的问题是,在加载窗口时,SelectedValue绑定会导致我的源数据更改为ItemsSource中的第一项,而不是将Combobox的SelectedValue设置为ItemsSource中的相应项。
CheckPrinterID来自listview选择datacontext,此问题仅发生在加载时该列表视图中最初选择的项目。当我在列表框中选择另一个项目时,组合框正确地选择了正确的项目,一切都很好,但不幸的是我的初始项目已经更新,现在不正确。
答案 0 :(得分:1)
我猜你试图通过公共属性同步ListView
和ComboBox
。尝试在ListView中将IsSynchronizedWithCurrentItem设置为True,并确保在加载期间设置SelectedItem
或SelectedIndex
ListView
。
答案 1 :(得分:0)
尝试在DisplayMemberPath之前重新安排ItemsSource。
答案 2 :(得分:0)
如果你在DataContext对象中有一些灵活性,你可以尝试将所选的CheckPrinter属性更改为数据对象类型而不是ID,并切换到使用SelectedItem而不是SelectedValue(由于某种原因,SelectedValue的行为有所不同,尤其是在初始时load)然后从代码中的该值中提取ID。
如果由于某种原因无法在DataContext对象中使用CheckPrinter对象,则可以使用ID列表作为ItemsSource,再次使用SelectedItem,在UI侧使用相反的方向。要获取列表以在ComboBoxItems中显示您想要的内容,您需要使用IValueConverter根据ID提取Description值:
<ComboBox ItemsSource="{Binding Source={StaticResource CvsPrinterIds}}" SelectedItem="{Binding CheckPrinterID}" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock >
<TextBlock.Text>
<Binding>
<Binding.Converter>
<local:MyDescriptionLookupConverter Printers="{StaticResource CvsPrinters}"/>
</Binding.Converter>
</Binding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
和一个简单的转换器来进行ID-Description查找(添加一些null和强制转换检查):
public class MyDescriptionLookupConverter : IValueConverter
{
public IEnumerable<Printer> Printers { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Printers.First(p => p.Id == (int)value).Description;
}
...
}