【发布时间】:2016-04-01 15:00:48
【问题描述】:
我无法以正确的布局将我的Dictionary<string, List<string>> 绑定到我的 WPF 数据网格。
这是我的数据对象:
public class Result
{
public Result(string type, string name, Dictionary<string, List<string>> partners)
{
Type = type;
Name = name;
Partners = partners;
}
public string Type { get; set; }
public string Name { get; set; }
public Dictionary<string, List<string>> Partners { get; set; }
}
我填充了虚拟数据并作为我的视图模型的公共属性公开:
public class MainViewModel
{
public MainViewModel()
{
var partners = new Dictionary<string, List<string>>
{
{"Company", new List<string> {"company1", "company2"}},
{"Operator", new List<string> {"false", "true"}},
{"Interest", new List<string> {"40%", "60%"}},
{"Type", new List<string> {"type1", "type2"}}
};
Asset = new Result("TestType", "TestName", partners);
}
public Result Asset { get; set; }
}
我正在尝试将Partners 字典绑定到我的数据网格。每个字典条目(例如公司 / 运营商 / 兴趣 / 类型)的 Key 应该构成我的数据网格的标题,相应的值填充列。像这样:
Company | Operator | Interest | Type
company1 false 40% type1
company2 true 60% type2
我怎样才能做到这一点?我一直在查看this question,但数据与我想要的相反。我希望我的键作为数据网格列标题(我不介意对标题进行硬编码,因为我相信标题属性不能使用数据绑定)。到目前为止,这是我的 XAML,itemsource 已正确绑定,但我不知道如何以我需要的格式获取数据:
<DataGrid x:Name="dg" ItemsSource="{Binding Asset.Partners}" AutoGenerateColumns="false">
<DataGrid.Columns>
<DataGridTextColumn Header="Company" Binding="{Binding ?}"/>
<DataGridTextColumn Header="Operator" Binding="{Binding ?}"/>
<DataGridTextColumn Header="Interest" Binding="{Binding ?}"/>
<DataGridTextColumn Header="Type" Binding="{Binding ?}"/>
</DataGrid.Columns>
</DataGrid>
如果我在第一列中使用Binding="{Binding Value[0]},那么我会在我的列中得到一个“行”值,但我希望它反过来。我也尝试过使用Binding="{Binding Asset.Partners[Company]}",但没有奏效。
任何帮助表示赞赏。
【问题讨论】:
-
不要在绑定中使用字典。出于多种不同的原因,它们很糟糕。创建一个特定的类型来保存您的键/值对并将它们放入 ObservableCollection。如果你是一个书呆子程序员,你可以创建一个 KeyedCollection
的实现,它实现了 INotifyCollectionChanged,它为你提供了字典的好处,但没有大量的麻烦。\ -
@Will - 在不告诉我原因的情况下告诉我他们“糟透了”并不是特别有帮助。
-
它们很糟糕的原因有很多,至少您遇到过其中一个。其他包括阻碍 DataTemplates 的功能、无更改通知等。正如您所了解的,它们很糟糕。坦率地说,更重要的是我对键控集合的建议。去查一下,不要在字典上浪费时间。