绑定字典<string,list <customobject =“”>&gt;到WPF中的ListBox

时间:2015-09-14 16:24:48

标签: c# wpf xaml data-binding

我有一个Dictionary<string, List<WritingMachine>>,其中键是写入服务器的机器的主机名,值是WritingMachine对象的列表(如下所示):

public class WritingMachine
{
    public string HostName { get; set; }
    public string Program { get; set; }
    public string Login { get; set; }
    public string Server { get; set; }
}

我试图将字典绑定到WPF ListBox;显示主机名(字典的密钥),以及与该密钥相关联的WritingMachine列表的摘要。

我无法访问列表中各个WritingMachine元素的属性。

到目前为止,这是我的XAML:

<ListBox x:Name="MachineListBox" Margin="10" Grid.Column="0" FontFamily="Consolas" ItemsSource="{Binding Path=MachineDictionary}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Margin="5">
                <ContentPresenter Content="{Binding Key}" Margin="0,0,4,0"/>
                <ItemsControl ItemsSource="{Binding Value}" Margin="10,0,0,0">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Vertical" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这会产生一个如下所示的列表框:

enter image description here

显然这是错误的,因为WritingMachine列表元素只返回默认的ToString。通过覆盖WritingMachine ToString我可以获得我想要的效果(或多或少):

enter image description here

但这是一种废话方式......我希望能够访问单个元素属性,并使用ListBox.ItemTemplate或类似内容将其排列在Content="{Binding Value.Server}"的控件中。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

对于ItemsControl,您需要设置一个ItemTemplate:

        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock>Server: </TextBlock>
                    <TextBlock Text="{Binding Server}"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>

那会让你开始。

答案 1 :(得分:0)

为内部控件设置DataContext属性以显示WritingMachine属性。 像这样:

<StackPanel DataContext="{Binding Value}" Grid.Row="1">

这会将DataContext更改为List<WritingMachine>以进行内部显示控制,您可以在其中进行常规绑定。请参阅下面的完整XAML代码:

<ListBox x:Name="LbxMachineDictionary" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="1">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical" Margin="5">
                        <Grid Width="461" Height="199">
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition Height="4*"/>
                            </Grid.RowDefinitions>
                            <TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="{Binding Key}" VerticalAlignment="Top"/>
                            <StackPanel DataContext="{Binding Value}" Grid.Row="1">
                                <TextBlock HorizontalAlignment="Left"  Grid.Row="1" TextWrapping="Wrap" Text="{Binding HostName}" VerticalAlignment="Top"/>
                                <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Program}" VerticalAlignment="Top"/>
                                <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Login}" VerticalAlignment="Top"/>
                                <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Server}" VerticalAlignment="Top"/>
                            </StackPanel>
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
相关问题