【问题标题】:WPF Combobox is changing source via SelectedValue when ItemsSource is loaded加载 ItemsSource 时,WPF Combobox 正在通过 SelectedValue 更改源
【发布时间】:2011-10-03 20:20:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: wpf binding combobox itemssource selectedvalue


    【解决方案1】:

    我猜你正试图通过一个公共属性来同步ListViewComboBox。尝试在 ListView 中将 IsSynchronizedWithCurrentItem 设置为 True,并确保在加载期间设置了 ListViewSelectedItemSelectedIndex

    【讨论】:

    • 天啊!!!!非常感谢!经过数小时的搜索和调试失败!我遇到了几乎同样的问题。但是当我打开第二个视图时,我的ComboBox.SelectedIndex 设置为-1!我将 IsSynchronizedWithCurrentItem="True" 添加到我的 ComboBox 并解决了问题!!!非常感谢。
    【解决方案2】:

    尝试在 DisplayMemberPath 之前重新排列 ItemsSource。

    【讨论】:

      【解决方案3】:

      如果您在 DataContext 对象中有一定的灵活性,您可以尝试将选定的 CheckPrinter 属性更改为数据对象类型而不是 ID,并切换到使用 SelectedItem 而不是 SelectedValue(由于某种原因 SelectedValue 的行为不同,尤其是在初始load),然后在代码中从该值中提取 ID。

      如果您出于某种原因无法在 DataContext 对象中使用 CheckPrinter 对象,您也可以在 UI 端使用 ID 列表作为 ItemsSource,然后再次使用 SelectedItem。要让列表在 ComboBoxItems 中显示您想要的内容,您需要使用 IValueConverter 根据 ID 提取描述值:

      <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;
              }
              ...
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-15
        • 2014-01-26
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 2012-06-22
        • 1970-01-01
        相关资源
        最近更新 更多