这是我的第一篇文章,所以我希望我做的一切都是正确的。
我正在尝试将XAML/WPF PropertyGrid绑定到IList< LivePacketDevice>,这有效,但我希望其中一些属性看起来不同。
从我收集的内容来看,有多种方法。最简单的方法之一是扩展LivePacketDevice类以包含[ExpandableObject] Attribute。但是这个类是密封所以在这种情况下我不能这样做。
此方法(http://www.codeproject.com/Articles/4448/Customized-display-of-collection-data-in-a-Propert)还包括修改实际类。似乎所有方法都修改了基类,或者更常见的是,创建一些从基类继承的包装器。
我的C#代码如下所示:
public partial class MainWindow : Window {
public MainWindow() {
Loaded += MainWindowLoaded;
InitializeComponent();
}
private void MainWindowLoaded(object sender, RoutedEventArgs e) {
// Retrieve the device list from the local machine
statusText.Text = "Retrieving Interfaces";
IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;
if (allDevices.Count == 0) {
lstInterfaces.IsEnabled = false;
statusText.Text = "No interfaces found! Make sure WinPcap is installed.";
return;
}
lstInterfaces.DisplayMemberPath = "Description";
lstInterfaces.ItemsSource = allDevices;
statusText.Text = "Interfaces retrieved. Select Item for additional Info.";
}
}
和XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" x:Class="TestApp.MainWindow"
Title="MainWindow" Height="652" Width="918">
<DockPanel x:Name="dockPanel1" VerticalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto"/>
<StatusBar DockPanel.Dock="Bottom">
<TextBlock x:Name="statusText" />
</StatusBar>
<Grid>
<ListBox x:Name="lstInterfaces" Height="216" VerticalAlignment="Top" Margin="10,35,10,0" />
<xctk:PropertyGrid x:Name="prpgrInterface" Margin="10,256,10,0" VerticalAlignment="Top" Height="334" AutoGenerateProperties="False" SelectedObject="{Binding ElementName=lstInterfaces, Path=SelectedItem}">
<xctk:PropertyGrid.PropertyDefinitions>
<xctk:PropertyDefinition Name="Name" />
<xctk:PropertyDefinition Name="Description" />
<xctk:PropertyDefinition Name="Addresses" />
</xctk:PropertyGrid.PropertyDefinitions>
</xctk:PropertyGrid>
</Grid>
</DockPanel>
</Window>
如果我像这样运行它,我会在网格中获得3个“属性”,“名称”和“ “描述”很好,但是地址实际上是一个集合,应该是可扩展的,而它只是给了我“System.Collection.ObjectModel.ReadOnlyCollection`1 [PcapDotNet.Core.DeviceAddress]”,因为那似乎是{ {1}}方法返回。
为了完整起见,这里是我正在谈论的截图(新用户,无法建立实际链接)(http://zentarim.0wnz.at/~mram/imgdump/not%20the%20way %20I%20want%20it.png)
请记住,我对C#/ wpf的经验很少,所以代码示例必须相当完整才能对我有用:)也很抱歉非链接链接但是我不能发布超过两个目前。谢谢!