运行时与ComboBox绑定的WPF DataGridTemplateColumn(不是MVVM)

时间:2015-10-22 00:25:43

标签: wpf xaml combobox

我在这里倾注了答案和例子,但似乎没有解决我的问题。

我有一个典型的DataGridTemplateColumn,带有TextBlock和ComboBox:

<DataGridTemplateColumn Header="Section" SortMemberPath="SectionName" CanUserSort="True">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding SectionName}">
                <TextBlock.Style>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Background" Value="{Binding SectionName, Converter={StaticResource SectionBackgroundConverter}}"/>
                        <Setter Property="Padding" Value="5,5,5,5"></Setter>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate >
        <DataTemplate >
            <ComboBox x:Name="cmbSections" ItemsSource="{Binding Path=g_colZDSectionNames}" SelectedItem="{Binding SectionName}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

TextBlock绑定到绑定到DataGrid的对象列表中的对象。它按预期显示其属性。

ComboBox需要绑定到运行时未知的字符串集合,直到函数调用Web服务来获取值。然后我将另一个不在DataGrid中的名为cmbDefaultSections的ComboBox绑定到以下ZDSection对象。它按预期显示列表。但是,如果我将DataBrid中的cmbSections绑定到同一个对象,或者如果我按照建议将其绑定到ObservableCollection(Of String),则它仍然为空。我怀疑这是因为在运行时创建ComboBox时,名为Sections的DynamicResource是Nothing,正如预期的那样。

在我的代码隐藏中,我正在设置另一个ComboBox的ItemsSource:

    cmbDefaultSections.ItemsSource = New ZDSections.ZDSection

现在我该如何设置cmbSections?它无法从代码中获取。我已经尝试在集合对象上实现INotifyCollectionChanged,以便它自动更新,但无济于事:

Public Class ZDSection
    Inherits ObservableCollection(Of String)
    Implements INotifyCollectionChanged

    Public Sub New()
        If g_lstZDSections IsNot Nothing Then
            For Each section In g_lstZDSections
                Me.Add(section.Name)
            Next section
            Call OnCollectionChanged(New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset))
        End If
    End Sub

    Public Shadows CollectionChanged As NotifyCollectionChangedEventHandler

    Protected Overrides Sub OnCollectionChanged(e As NotifyCollectionChangedEventArgs)
        MyBase.OnCollectionChanged(e)
        If CollectionChanged IsNot Nothing Then
            CollectionChanged.Invoke(Me, e)
        End If
    End Sub

End Class

提前感谢您的建议!

2 个答案:

答案 0 :(得分:0)

分配ItemsSource只能进行一次。似乎ZDSection过度杀戮,只有ObservableCollection<string>就足够了,因为它天生地通知收集更改并且ComboBox项已更新。

comboBox.ItemsSouce = stringCollection;

其他地方:

stringCollection.Add(stringFetched);

答案 1 :(得分:0)

经过几天的死胡同,最终使用Collection Loading Data and Binding Controls in WPF with CollectionViewSource中描述的CollectionViewSource工作。