如何在DataTemplate中访问ComboBox的SelectedItem

时间:2016-08-25 07:48:08

标签: c# wpf xaml combobox binding

我关注XAML:

<ItemsControl x:Name="TextComboPairItemsControl" Grid.Row="1" Grid.ColumnSpan="2"
                  ItemsSource="{Binding Path=AllHeaders.Fields}">
         <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>

                        <TextBlock x:Name="TextBlock1" Text="{Binding}"
                                   Grid.Column="0" Margin ="2"/>
                        <ComboBox x:Name="ComboBox1" ItemsSource="{Binding ElementName=MainGrid, Path=DataContext.Tags}"
                                  SelectedItem="{Binding ElementName=MainGrid, Path=DataContext.TextComboPairList.Combo}"
                                  Grid.Column="1" Margin ="2" SelectedIndex="0" IsEditable="True"/>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
    </ItemsControl>

现在,在我的代码中,我希望能够读取用户在每个ComboBox中选择的内容。为此我创建了一个类:

public class TextComboPair
{
    public string TextContent { get; set; }
    public string ComboContent { get; set; }
}

每对TextBlock和ComboBox都有自己的上述类对象。 我还创建了一个列表来存储所有这些数据对:

public List<TextComboPair> TextComboPairList 
{
    get; 
    set; 
}

它在我的DataContext中定义。

因此,例如,如果在屏幕上显示了三个TextBlock-ComboBox对的列表,并且用户将在每个ComboBox中选择他需要的内容,我希望上面的List填充了该数据。< / p>

正如您在XAML中看到的,我将Selected Item绑定到此List,但我一定做错了。

我可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

<ComboBox x:Name="ComboBox1" ItemsSource="{Binding  Path=DataContext.Tags, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl }}}"
                              SelectedItem="{Binding  RelativeSource={RelativeSource AncestorType={x:Type ItemsControl }}, Path=DataContext.TextComboPairList.Combo}"
                              Grid.Column="1" Margin ="2" SelectedIndex="0" IsEditable="True"/>