【问题标题】:Unable to get ItemsSource working dynamically for DataGridComboBoxColumn无法让 ItemsSource 为 DataGridComboBoxColumn 动态工作
【发布时间】:2014-07-01 08:28:15
【问题描述】:

我正在尝试将 DataGridComboBoxColumnItemsSource 属性绑定到我的 ViewModel 的属性。我了解由于某些限制,如果不使用某种静态列表或解决方法,这是不可能的。

我选择了解决方法。我在this StackOverflow 线程上尝试了所有答案,但没有运气,最近我尝试了this 解决方法,也没有运气。

这是我上次尝试的 XAML:

<DataGridComboBoxColumn Header="Action"
                        SelectedValueBinding="{Binding DISPLAY_ACTION_ID, Mode=TwoWay}"
                        SelectedValuePath="DISPLAY_ACTION_ID"
                        DisplayMemberPath="DISPLAY_ACTION_DESC">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding ActionSource}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding ActionSource}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

我还尝试根据this 线程调整ItemsSource 绑定,但没有成功。

这是我的 ViewModel 属性以防万一:

public List<DISPLAY_ACTION> ActionSource
{
    get
    {
        return _actionSource;
    }
}

我得到的只是一个空的值列表。如果我在属性 getter 上放置一个断点,它永远不会中断,即 XAML 似乎没有找到 ActionSource 绑定。任何关于为什么这可能不起作用的帮助或指导将不胜感激。

编辑 - 更新 XAML:

<DataGrid HorizontalAlignment="Stretch"
          VerticalAlignment="Top"
          SelectionMode="Single"
          RowHeaderWidth="20"
          AutoGenerateColumns="False"
          AlternatingRowBackground="Transparent"
          ItemsSource="{Binding DisplayItemsView}">
    <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Action"
                                SelectedValueBinding="{Binding DISPLAY_ACTION_ID, Mode=TwoWay}"
                                SelectedValuePath="DISPLAY_ACTION_ID"
                                DisplayMemberPath="DISPLAY_ACTION_DESC">
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding DataContext.ActionSource, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding DataContext.ActionSource, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
                </Style>
            </DataGridComboBoxColumn.EditingElementStyle>
        </DataGridComboBoxColumn>
    </DataGrid.Columns>
</DataGrid>

调试错误:

System.Windows.Data 错误:4:找不到与引用 RelativeSource FindAncestor 进行绑定的源,AncestorType='System.Windows.Window',AncestorLevel='1''。 BindingExpression:Path=DataContext.ActionSource;数据项=空;目标元素是'TextBlockComboBox'(名称='');目标属性是“ItemsSource”(类型“IEnumerable”)`

【问题讨论】:

  • @dkozl 是的,根据我提到的限制,这不起作用。在this线程中有解释。
  • 不应该是 的可观察集合吗
  • 你的DataGrid.ItemsSource绑定到什么?
  • @amnezjak 绑定到DisplayItemsViewListCollectionViewDISPLAY_ITEMs。

标签: c# wpf xaml mvvm datagridcolumn


【解决方案1】:

假设您的DataGrid 绑定到MyItem 对象列表。你有两个选择:

a) 每个MyItem 对象都包含填充的ActionSource 列表。

b) 您的主 ViewModel 包含 MyItem 对象列表(绑定到 DataGrid) 和 ActionSource 列表。然后你应该改变 ComboBox ItemsSource 绑定到:

<Setter Property="ItemsSource" Value="{Binding DataContext.ActionSource, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />

在这两种情况下,您都必须确保 SelectedValueBinding 指向 MyItem 对象的属性,而不是 DISPLAY_ACTION 对象。

【讨论】:

  • 不幸的是,这仍然对我不起作用。我更新了我的帖子以反映我的新 XAML 显示您的更改。请注意,DISPLAY_ACTION_ID 的选定值投标实际上是 DisplayItemsView 项目的属性,因此应该没问题。
  • 所以DISPLAY_ITEMDISPLAY_ACTION 都有DISPLAY_ACTION_ID 属性,对吧?他们匹配?如果是这样,这似乎没问题。也许您应该发布您的 ViewModel 代码。另外,尝试使用以下代码调试您的绑定:stackoverflow.com/a/1125668/1851106
  • 是的,他们都有DISPLAY_ACTION_ID,这是一对一的关系。如果我没有运气,我将尝试使用您发布的方法进行调试并返回。感谢您的帮助,我很感激。
  • 感谢调试提示,它确实引发了错误。我更新了我的帖子以包含错误消息。
  • 似乎在 DataGrid 下找不到窗口。它位于窗口的什么位置?另外,尝试将AncestorType 更改为DataGrid。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多