绑定一些引用的对象属性

时间:2013-04-09 10:18:38

标签: c# wpf binding

我有一本字典:

private Dictionary<int, ICar> _ICarsDic;

对象ICar实际上包含另一个对象列表:

public interface ICar 
{
    int carId { get; set; }
    string carName { get; set; }
    Dictionnary<int,IBrandsDetails> brandsDetails { get; set; }
}

我将这个CarsDic词典绑定到DataGrid(之前将它转换为IEnumerable,但这不是问题的重点,所以没有在这里显示)。

<DataGrid Name="Cars"
    ItemsSource="{Binding}" 
    SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel=2}, Path=SelectedCar, Mode=TwoWay}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Car Id" Binding="{Binding CarId}" IsReadOnly="True" />
        <DataGridTextColumn Header="Car Name" Binding="{Binding carName}" IsReadOnly="True" />
    </DataGrid.Columns>

我的问题是我想显示BrandsDetails中的一些数据(所有汽车都很常见),例如徽标。这个synthax虽然不起作用:

<DataGridTextColumn Header="Full Name" Binding="{Binding BrandsDetails.Logo}" IsReadOnly="True" />

提前感谢您的回答!

2 个答案:

答案 0 :(得分:1)

我想知道以下链接可以解决您的问题

http://www.dev102.com/2008/03/07/binding-a-wpf-control-to-a-dictionary/

引用

绑定到字典可能很棘手。

这听起来很简单,但它在第一次尝试时从不起作用。通常,当您第一次运行应用程序时,您会看到而不是您为项目创建的漂亮模板,而是获得看起来像一对键和值的内容。你的绑定工作正常,你只是没有考虑你绑定的是什么。字典中的每个项目都是一对(Key,Value),这正是您作为绑定项目获得的内容。您有两种处理方法,您可以更改Binding表达式的标记以包含对值的引用:

<ComboBox.ItemTemplate>
             <DataTemplate>
                 <StackPanel Orientation="Horizontal">
                     <TextBlock Text="{Binding Value.Text}"></TextBlock>
                     <TextBlock> = </TextBlock>
                     <TextBlock Text="{Binding Value.Value}"></TextBlock>
                 </StackPanel>
             </DataTemplate>
         </ComboBox.ItemTemplate>

或者您可以更改控件的绑定表达式以引用字典的Values属性:

 <ComboBox Height="23" Margin="0,14,9,0" Name="comboBox1"
                  VerticalAlignment="Top" SelectedValuePath="Key"
                  ItemsSource="{Binding Items.Values}"
                  HorizontalAlignment="Right" Width="120">

现在你把你的控制绑定到一个字典,华友世纪!

答案 1 :(得分:0)

对于这个答案,我将假设您的DataGrid绑定到包含ICar实现对象的Dictionary(您的确切绑定既不清楚又过于复杂)。

您的BrandsDetails绑定失败的原因是该属性实际上是Dictionary,并且您知道该属性没有Logo属性。理想情况下,DataGrid列应该具有某种类型的转发器控件,如ListView或其他DataGrid,或者使用MultiBinding和转换器 - 这是您能够从该属性显示完整Dictionary的唯一方法。否则,您将在绑定路径中need to use indexing选择一个项目。