C# 将XAML绑定到字典

C# 将XAML绑定到字典,c#,wpf,dictionary,binding,C#,Wpf,Dictionary,Binding,考虑以下代码: public class Person { public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } } public class HealthInfo { public int BMI { get; set; } public int HeartRate { get; set; } public string DietPlan { get;

考虑以下代码:

public class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}

public class HealthInfo {
public int BMI { get; set; }
public int HeartRate { get; set; }
public string DietPlan { get; set; }
}


Dictionary<Person, HealthInfo> myPersonInfo = new Dictionary<Person, HealthInfo>();

myPersonInfo.Add( new Person { Id = 1, Name = "Name1", Surname = "Surname1" }, new HealthInfo { BMI = 1, DietPlan = "Banting", HeartRate = 20 } );
myPersonInfo.Add( new Person { Id = 1, Name = "Name2", Surname = "Surname2" }, new HealthInfo { BMI = 1, DietPlan = "Banting", HeartRate = 20 } );
myPersonInfo.Add( new Person { Id = 1, Name = "Name3", Surname = "Surname3" }, new HealthInfo { BMI = 1, DietPlan = "Banting", HeartRate = 20 } );
myPersonInfo.Add( new Person { Id = 1, Name = "Name4", Surname = "Surname4" }, new HealthInfo { BMI = 1, DietPlan = "Banting", HeartRate = 20 } );
公共类人物{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
}
公共类健康信息{
公共整数BMI{get;set;}
公共整数心率{get;set;}
公共字符串DietPlan{get;set;}
}
Dictionary myPersonInfo=新字典();
myPersonInfo.Add(新的人{Id=1,Name=“Name1”,姓氏=“names1”},新的健康信息{BMI=1,DietPlan=“Banting”,心率=20});
myPersonInfo.Add(新的人{Id=1,Name=“Name2”,姓氏=“names2”},新的健康信息{BMI=1,DietPlan=“Banting”,心率=20});
myPersonInfo.Add(新的人{Id=1,Name=“Name3”,姓氏=“names3”},新的健康信息{BMI=1,DietPlan=“Banting”,心率=20});
myPersonInfo.Add(新的人{Id=1,Name=“Name4”,姓氏=“names4”},新的健康信息{BMI=1,DietPlan=“Banting”,心率=20});
我正试图从我的xaml绑定到这本词典(myPersonInfo) 为每个人创建一个选项卡,其中选项卡标题将是该人的姓名,然后该选项卡的内容将显示HealtInfo

我在XAML中绑定到这本词典有困难

我有以下资料:

<TabControl ItemsSource="{Binding myPersonInfo.Keys}" SelectedIndex="0">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Name}"/>
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                   <DataTemplate>
                       <TextBlock Text="{Binding Path=Key.Value.BMI}"/>
                   </DataTemplate>
                </TabControl.ContentTemplate>
</TabControl>

如何使用ItemTemplate的键(Person)的属性 和 如何为当前键的ContentTemplate使用值(HealtInfo)的属性?

创建“聚合”类,并在数据绑定很好地支持的
ObservableCollection中使用它

 public class PersonHealthInfo
 {
     public Person Person {get; set; }
     public HealthInfo HealthInfo {get; set; }
 }

ObservableCollection<PersonHealthInfo> persons = new ObservableCollection<PersonHealthInfo>();

var person1 = new PersonHealthInfo
{
    Person = new Person { Id = 1, Name = "Name1", Surname = "Surname1" },
    HealthInfo = new HealthInfo { BMI = 1, DietPlan = "Banting", HeartRate = 20 }
}

persons.Add(person1);
公共类PersonHealthInfo
{
公众人物{get;set;}
公共HealthInfo HealthInfo{get;set;}
}
ObservableCollection persons=新的ObservableCollection();
var person1=新的PersonHealthInfo
{
Person=新人{Id=1,Name=“Name1”,Name=“names1”},
HealthInfo=newhealthinfo{BMI=1,DietPlan=“Banting”,心率=20}
}
人员。添加(人员1);
创建“聚合”类,并在数据绑定很好地支持的
ObservableCollection
中使用它

 public class PersonHealthInfo
 {
     public Person Person {get; set; }
     public HealthInfo HealthInfo {get; set; }
 }

ObservableCollection<PersonHealthInfo> persons = new ObservableCollection<PersonHealthInfo>();

var person1 = new PersonHealthInfo
{
    Person = new Person { Id = 1, Name = "Name1", Surname = "Surname1" },
    HealthInfo = new HealthInfo { BMI = 1, DietPlan = "Banting", HeartRate = 20 }
}

persons.Add(person1);
公共类PersonHealthInfo
{
公众人物{get;set;}
公共HealthInfo HealthInfo{get;set;}
}
ObservableCollection persons=新的ObservableCollection();
var person1=新的PersonHealthInfo
{
Person=新人{Id=1,Name=“Name1”,Name=“names1”},
HealthInfo=newhealthinfo{BMI=1,DietPlan=“Banting”,心率=20}
}
人员。添加(人员1);

您需要更改xaml中的绑定

<TabControl ItemsSource="{Binding myPersonInfo}" SelectedIndex="0">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Key.Name}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Value.BMI}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

另外,myPersonInfo应该是一个属性。因此,请这样声明:

public Dictionary<Person, HealthInfo> myPersonInfo { get; set; }
公共字典myPersonInfo{get;set;}

虽然这个代码会起作用,但是考虑重构你的模型以使它更干净。

你需要改变XAML中的绑定。< /P>
<TabControl ItemsSource="{Binding myPersonInfo}" SelectedIndex="0">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Key.Name}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Value.BMI}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

另外,myPersonInfo应该是一个属性。因此,请这样声明:

public Dictionary<Person, HealthInfo> myPersonInfo { get; set; }
公共字典myPersonInfo{get;set;}

尽管这个代码会起作用,但是考虑重构你的模型以使它更干净。< /P>有什么理由使用字典而不是使用一个正确的视图模型?我正在使用字典来组合两个模型。您应该使用聚合类(参见Fabios答案)。清晰的代码和实现INotifyPropertyChanged的可能性只是两个优点。有没有理由使用字典而不是ObservableCollection和适当的ViewModels?如果使用适当的viewmodel,代码只是一个简单的示例。我正在使用字典来组合两个模型。您应该使用聚合类(参见Fabios答案)。清晰的代码和实现INotifyPropertyChanged的可能性只是两个优点。漂亮而干净的解决方案!又好又干净的解决方案!