【问题标题】:Combobox Selected Value returns System.Data.DataRowView组合框选定值返回 System.Data.DataRowView
【发布时间】:2020-11-20 22:58:37
【问题描述】:

我有一个 SQL 表,其中包含用于填充 WPF 组合框的列“AreaCode”和“Description”。但是当我在组合框上选择一个项目时,它会在组合框文本上显示 System.Data.DataRowView。下面是组合框的 xaml。

                    <ComboBox x:Name="AreaComboBox" Grid.Row="3" Grid.Column="1" Width="300" Margin="5" IsEditable="True" ItemsSource="{Binding}" SelectedValuePath="Description">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock x:Name="Area" Text="{Binding AreaCode}"/>
                                    <TextBlock Text=" "/>
                                    <TextBlock x:Name="Description" Text="{Binding Description}"/>
                                </StackPanel>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>

使用简单的 c# 代码填充组合框: AreaComboBox.ItemsSource = dataSet.Area.AsDataView();

我注意到,如果我将 IsEditable 更改为 False,这不是问题,只有当它为 true 时才会出现问题。

有人可以帮我弄清楚为什么它返回“System.Data.DataRowView”而不是我选择的项目的文本吗? 如果有解决方案会更好:)

我非常乐意提供更多详细信息。

【问题讨论】:

  • 这个答案可能会帮助您找到解决方案:stackoverflow.com/a/3672098/9365244
  • 您将 itemsource 绑定两次?在代码隐藏和 xaml 中?
  • @Bandook 不幸的是,这是在多次尝试使其工作之后,包括尝试不同的绑定方式。这一切都有相同的结果:(。或者你认为这可能是问题吗?
  • 我没有对此进行测试,但我会猜测一下。通过执行“ItemsSource={Binding}”,您将 itemssource 绑定到视图本身的数据上下文,并且在您的代码隐藏中,您将绑定到“dataSet.Area.AsDataView()”的返回集合。当 IsEditable 更改时,哪个绑定优先更改。这可能是错误的,但我首先想消除双重绑定场景 - 我会通过首先删除 xaml.xml 中的绑定来测试您的代码。如果这不起作用,请将其放回原处并删除代码隐藏绑定。但更重要的是,这不是对 ItemsSource 的良好绑定。
  • 我的请求 - 请向我们提供以下信息 - (1) 您何时/何地调用“dataSet.Area.AsDataView()”,即显示您在代码中设置 itemssource 的方法-后面和(2)这个“dataSet.Area.AsDataView()”的返回类型是什么。

标签: c# wpf combobox visual-studio-2019


【解决方案1】:

您可以为 StackPanel 设置事件MouseLeftButtonDown="StackPanel_MouseDown",然后使用以下代码更新 ComboBox 的文本。

 private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e)
    {
        string tb1 = ((TextBlock)(sender as StackPanel).Children[0]).Text;
        string tb2 = ((TextBlock)(sender as StackPanel).Children[1]).Text;
        string tb3 = ((TextBlock)(sender as StackPanel).Children[2]).Text;

        AreaComboBox.Text = tb1 +"   "+ tb3;

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2015-08-04
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多