我有一个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>
这会产生一个如下所示的列表框:
显然这是错误的,因为WritingMachine
列表元素只返回默认的ToString
。通过覆盖WritingMachine
ToString
我可以获得我想要的效果(或多或少):
但这是一种废话方式......我希望能够访问单个元素属性,并使用ListBox.ItemTemplate
或类似内容将其排列在Content="{Binding Value.Server}"
的控件中。
有什么想法吗?
答案 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>