如何在wpf中绑定一个具有项目作为数据网格的组合框? ComboBox本身是Datatemplate的一部分

时间:2011-07-19 05:09:30

标签: mvvm binding

我有一个TabControl使用WPF在MVVM模式之后生成一些选项卡项。 TabControl ItemTemplate即对于生成的每个选项卡项,我有一个组合框,应该显示来自不同列表的一些数据。 此列表与制表符项本身的绑定对象不同。

例如:如果tabitem绑定到地址对象,则组合框应显示状态列表中的数据,并将地址对象中显示的状态显示为所选项目。

组合框只有一个项目作为数据网格绑定到状态列表

问题是所有数据都显示在所有部分中,但组合框根本不会显示数据。令人惊讶的是,从TabControl DataTemplate中取出时的Combobox工作正常......

下面是tabcontrol外部和内部的代码。请一些建议!!!

------这个在Tabcontrol之外并且完美地运作--------------

<ComboBox SelectedValue="{Binding SelectedState}" HorizontalAlignment="Left" VerticalAlignment="Center" IsEditable="True" Margin="50,55,0,61" Height="27" Width="193">
                    <ComboBoxItem TextSearch.Text="{Binding SelectedState}">
                        <ContentControl>
                            <DataGrid SelectedIndex="{Binding StateSelectedIndex}" ItemsSource="{Binding StateData}" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" VerticalAlignment="Top" Width="200" cal:Message.Attach="[Event SelectionChanged] = [Action SelectionChanged]">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="StateName" Binding="{Binding StateName}" />
                                </DataGrid.Columns>
                            </DataGrid>
                        </ContentControl>
                    </ComboBoxItem>
                </ComboBox>

----这个位于TabControl ---------

   <TabControl Margin="3,3,0,0"  HorizontalAlignment="Left" Width="752" Height="255" VerticalAlignment="Top" Grid.ColumnSpan="2" Grid.Row="1" ItemsSource="{Binding Addresses}" SelectedIndex="{Binding WhichAddressTab}" >
            <TabControl.ItemContainerStyle>
                    ...................................
            </TabControl.ItemContainerStyle>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <ContentControl>
                              ..........................
                                <ComboBox SelectedValue="{Binding SelectedState}" HorizontalAlignment="Left" VerticalAlignment="Center" IsEditable="True" Margin="108,3,0,1" Grid.ColumnSpan="3" Grid.Row="1" Width="147">
                                    <ComboBoxItem TextSearch.Text="{Binding SelectedState}" >
                                        <ContentControl>                                                
                                            <DataGrid SelectedIndex="{Binding StateSelectedIndex}" ItemsSource="{DynamicResource StateData}"  AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" VerticalAlignment="Top" Width="200" cal:Message.Attach="[Event SelectionChanged] = [Action SelectionChanged]">
                                                <DataGrid.Columns>
                                                    <DataGridTextColumn Header="StateName" Binding="{Binding StateName}" />
                                                </DataGrid.Columns>
                                            </DataGrid>
                                        </ContentControl>
                                    </ComboBoxItem>
                                </ComboBox>
                             ...........................
                        </Grid>
                    </ContentControl>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>

我尝试过搜索并且已经理解问题在于数据模板中的数据绑定,但是无法实现所需的结果。

1 个答案:

答案 0 :(得分:0)

是的,问题出在你的绑定上。 DataTemplate内部的DataContext用于单个元素(从绑定到ItemsSource的集合)。这意味着您无法访问直接在ViewModel本身上的属性。

要解决此问题,您可以将TabControl命名为示例,并将DataTemplate内的绑定转换为使用ElementName绑定。如果将ViewModel定义为静态资源,则另一种解决方案是直接绑定到资源,并使用Path指定要绑定的属性。

希望这会有所帮助:)