当加载ItemsSource时,WPF Combobox正在通过SelectedValue更改源

时间:2011-07-12 17:26:34

标签: wpf binding combobox itemssource selectedvalue

我的WPF窗口中有这个组合框。

<ComboBox DisplayMemberPath="Description" SelectedValuePath="ID" ItemsSource="{Binding Source={StaticResource CvsPrinters}}" SelectedValue="{Binding CheckPrinterID}" />

我的问题是,在加载窗口时,SelectedValue绑定会导致我的源数据更改为ItemsSource中的第一项,而不是将Combobox的SelectedValue设置为ItemsSource中的相应项。

CheckPrinterID来自listview选择datacontext,此问题仅发生在加载时该列表视图中最初选择的项目。当我在列表框中选择另一个项目时,组合框正确地选择了正确的项目,一切都很好,但不幸的是我的初始项目已经更新,现在不正确。

3 个答案:

答案 0 :(得分:1)

我猜你试图通过公共属性同步ListViewComboBox。尝试在ListView中将IsSynchronizedWithCurrentItem设置为True,并确保在加载期间设置SelectedItemSelectedIndex 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;
        }
        ...
    }