IFormattable and ItemStringFormat in WPF's MVVM

通常我们会将类的某个属性作为字符显示在界面上。但是如果要显示某些属性的组合呢?
将这些组合作为属性引入类中?
且听慢慢道来。。。

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,那么我们也可顺便这么应用下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值