我的应用程序中有以下界面:
public interface IContactMedium
{
string ContactString { get; set; }
string Type { get; set;}
bool IsValid();
}
该接口适用于代表某人某种联系的对象。它可以是电话、电子邮件等。ContactString
property 是实际的联系数据(例如,对于电话,它是电话号码),并且Type
用于区分一个人拥有多个电话(对于电话,一个人可以拥有家庭电话、工作电话、手机等)IsValid
方法是针对每种不同类型的接触介质的验证机制。
所以,假设我的应用程序中有两个对象 -Email
and Phone
- 两者都实现接口。我要在应用程序中创建一个UserControl
它拥有一个管理此类对象列表的 UI。所以视图模型看起来像这样:
public class ContactsCollectionViewModel<T> : ViewModelBase where T : class, IContactMedium
{
private ObservableCollection<T> _itemsCollection;
public ContactCollectionViewModel(ObservableCollection<T> items)
{
ItemsCollection = items;
}
public ObservableCollection<T> ItemsCollection
{
get { return _itemsCollection; }
set
{
if (_itemsCollection != value)
{
_itemsCollection = value;
OnPropertyChanged(() => ItemsCollection);
}
}
}
}
我想添加到IContactMedium
接口另一个属性/方法,为ContactString
在 WPF 中的绑定中使用时的属性。这个想法是文本框中的格式绑定到ContactString
根据实际存储在集合中的具体对象而有所不同:
<TextBox x:Name="ContactString"
Text="{Binding ContactString, StringFormat=???}" />
我在网上搜索了这个问题的解决方案,但找不到任何东西。我看到有人建议修改ContactString
属性,以便 getter 返回一个格式化的值。所以,对于Phone
例如,对象的属性如下所示:
public string ContactString
{
get
{
return string.Format("({0}) {1}-{2}", _contactString.Substring(0,3), _contactString.Substring(4,3), _contactString.Substring(7,3));
}
set {
_contactString = value;
}
}
然而,这对我来说不是一个好的解决方案。该信息不仅由 UI 使用。它还会发送到应用程序的其他部分,包括需要原始形式电话号码的数据库:##########。
有没有办法为 XAML 提供一个格式化程序以在StringFormat
绑定的属性?格式可以由实现接口的对象决定吗?如果是,它需要是什么类型,以及如何使其可供访问Binding
在 XAML 中?