通常我们会将类的某个属性作为字符显示在界面上。但是如果要显示某些属性的组合呢?
将这些组合作为属性引入类中?
且听慢慢道来。。。
1、Object.ToString():一个简单的MVVM绑定
Model:
public class Person : IFormattable
{
public string Name { get; set; }
public string IdNumber { get; set; }
public string Address { get; set; }
}
XAML:
<ListBox ItemsSource="{Binding PersonList}"/>
Output:
FormatStringMvvM.Person
Conclusion:
从结果来看,调用Object.ToString()方法,显示类型的全名称。
2、DisplayMemberPath:显示某个属性
设置DisplayMemberPath属性即可。。简单(●’◡’●)
XAML:
<ListBox ItemsSource="{Binding PersonList}" DisplayMemberPath="Name" />
Output:
John
Conclusion:
设置DisplayMemberPath属性,会调用该属性的ToString()方法。
3、IFormattable vs Object.ToString:如果类实现了接口IFormattable了呢?
Person类实现了接口IFormattable会怎样呢?调用哪个ToString()方法呢?
Model:
public class Person : IFormattable
{
//。。
public string ToString(string format, IFormatProvider formatProvider)
{
return "Call ToString() in IFormattable";
}
}
XAML:
<ListBox ItemsSource="{Binding PersonList}" >
Output:
Call ToString() in IFormattable
Conclusion:
这样情况下,不会调用Object.ToString()方法;而是调用了IFormattable.ToString()方法。
4、IFormattable vs DisplayMemberPath:如果类实现了接口IFormattable且设置了DisplayMemberPath属性呢?
Person类实现了接口IFormattable且设置了DisplayMemberPath属性会怎样显示呢?
XAML:
<ListBox ItemsSource="{Binding PersonList}" DisplayMemberPath="Name">
Output:
John
Conclusion:
这样情况下,DisplayMemberPath具有较高的优先级。
5、IFormattable+ItemStringFormat:显示某些属性的组合
现在应该明白了,我们可以要利用IFormattable.ToString()方法、不设置DisplayMemberPath属性和设置ItemStringFormat属性来实现属性的组合。
Model:
public class Person : IFormattable
{
public string Name { get; set; }
public string IdNumber { get; set; }
public string Address { get; set; }
public string ToString(string format, IFormatProvider formatProvider)
{
if (string.IsNullOrEmpty(format) || format.Equals("G"))
return this.ToString();
switch (format)
{
case "N":
return Name;
case "NI":
return string.Format("{0}({1})", Name, IdNumber);
case "ND":
return string.Format("{0}({1})", Name, Address);
case "NID":
return string.Format("{0}({1} & {2})", Name, IdNumber, Address);
default:
return this.ToString();
}
}
}
XAML:
<ListBox ItemsSource="{Binding PersonList}" ItemStringFormat="NID"/>
Output:
John(340322 & Ford Road 307)
Conclusion:
利用IFormattable和ItemStringFormat实现了属性组合且没有引入属性。
6、IFormattable+ItemStringFormat+DisplayMemberPath:类实现了接口IFormattable、设置ItemStringFormat属性且还设置DisplayMemberPath属性了呢( ▼-▼ )
XAML:
<ListBox ItemsSource="{Binding PersonList}" ItemStringFormat="NID" DisplayMemberPath="Name"/>
Output:
John
Conclusion:
看来DisplayMemberPath的优先级最高了~~
7、优先级
那么我们可以看出来影响界面字符显示的属性的优先级了~~
Conclusion:
DisplayMemberPath > IFormattable+ItemStringFormat > Object.ToString
8、总结
从结果来看,目的是达到了:即显示了属性组合的信息,又避免了引入一些无关的属性。
相对的这种方法没有直接引入属性来的直观和易用。如果需要引入的属性较少,觉得还是直接引入吧!╮(╯-╰)╭ 但是如果出于其他目的实现接口IFormattable,那么我们也可顺便这么应用下。