【问题标题】:DataGridComboBoxColumn data bindingDataGridComboBoxColumn 数据绑定
【发布时间】:2011-10-26 09:21:06
【问题描述】:

我正在尝试数据绑定DataGridComboBoxColumn

<DataGridComboBoxColumn Header="Number of Copies" SelectedItemBinding="{Binding NumberCopies}">
    <DataGridComboBoxColumn.ElementStyle>
       <Style TargetType="ComboBox">
          <Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
          <Setter Property="IsReadOnly" Value="True"/>
       </Style>
    </DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>

我在这里做错了什么,因为我在运行时得到了一个空的组合框。


我关注了

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=LifeAreaList;数据项=空;目标元素是“DataGridComboBoxColumn”(HashCode=49475561);目标属性是“ItemsSource”(类型“IEnumerable”)

【问题讨论】:

  • 运行时输出窗口会报什么错误?

标签: .net wpf xaml datagrid binding


【解决方案1】:

DataGridColumn 不是从FrameworkElementFrameworkContentElement 派生的,因此它不在可视树中,也没有DataContext,这就是您的绑定失败的原因。

如果您要绑定的List&lt;int&gt; 对于每个项目都相同,那么也许您应该找到另一种方法来绑定它,也许您可​​以将其设为静态并在绑定中使用StaticResource

无论如何,要将ItemsSource 绑定到源类中的List&lt;int&gt; 属性,您可以使用ElementStyleElementEditingStyle(正如其他人所指出的那样)。以下应该工作

<DataGridComboBoxColumn Header="Number of Copies"
                        SelectedItemBinding="{Binding ListAreaItem}">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

【讨论】:

  • ,感谢您的回答,看起来很有趣。如果我将我的 List 设为静态,我该如何绑定它?你能给我举个例子吗?
  • @Night Walker:我现在不在电脑前,但请查看以下链接:stackoverflow.com/questions/936304/…
  • 现在我认为更深层次的静态对我没有帮助,因为我需要在组合框中获取选定的项目,如果我也开始对这些项目使用静态,我会遇到问题。
  • @Night Walker:这不是问题。 ComboBoxes 将共享 ItemsSource,但它们将拥有单独的 SelectedItems,以便该部分已经为您工作。您的 SelectedItemBinding 可以保持原样
  • 谢谢你的例子真的很有帮助,解决了我的问题。您能否还添加一个静态绑定示例。我已经尝试过,但在我的情况下它不是那么有效,但可能我做错了什么(对 xaml 来说太新了)
【解决方案2】:

您不应该在样式中设置ItemsSource,列本身has such a property 可能会覆盖您可能尝试在样式中设置的任何内容。此外,您尝试将其设置为错误的样式(该样式用于显示模式),您可以尝试将其设置为 EditingElementStyle,但我也不建议这样做。

【讨论】:

    【解决方案3】:

    我会尝试使用 PresentationTraceSources.TraceLevel="High" 的常规 DataGridColumn,看看您是否遇到绑定问题。

    【讨论】:

      【解决方案4】:

      为什么要在样式中设置 Items 源?

      你能试试这个代码吗:

       <my:DataGridTemplateColumn Header="Number of Copies" >
                          <my:DataGridTemplateColumn.CellTemplate>
                              <DataTemplate>
                                  <ComboBox ItemsSource="{Binding Path=LifeAreaList}"  >
                                     <ComboBox.ItemTemplate>
                                      <DataTemplate>
                                          <Label Content="{Binding .}"></Label>
                                      </DataTemplate>
                                     </ComboBox.ItemTemplate>
                                  </ComboBox>
                              </DataTemplate>
                          </my:DataGridTemplateColumn.CellTemplate>
                      </my:DataGridTemplateColumn>
      

      如果 LifeAreaList 是复杂的类集合并且您希望以自定义方式显示它,则为 DataGridTemplateColumn 定义数据模板。

      【讨论】:

      • 我已经尝试过 我仍然看到空的组合框。其他具有 DataGridTextColumn 绑定的列工作正常。
      • 你可以试试 TemplateColumn 吗?
      • 我得到的是空的组合框,没有我在那里添加的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多