2017-02-14 7 views
0

Что мне нужно для инициализации объекта с помощью не-примитивного свойства.Создание объекта XAML с непримитивным свойством

Как при наличии следующей модели и ViewModel:

public class ListEntry 
{ 
    public int ID { get; set; } 
    public string IP { get; set; } 
} 

public class ViewModel 
{ 
    public ObservableCollection<ListEntry> ListEntries { get; set; } 
} 

тогда я могу закодировать этот XAML DesignData:

<nc:ViewModel 
    xmlns:nc="clr-namespace:NetWorkItOut.NetworkClasses"> 
    <nc:ViewModel.ListEntries> 
     <nc:ListEntry ID="1" IP="192.168.178.1" /> 
     <nc:ListEntry ID="2" IP="192.168.178.255" /> 
    </nc:ViewModel.ListEntries> 
</nc:ViewModel> 

и все работает. Но при замене

public string IP { get; set; } 

с

public IPAddress IP { get; set; } 

это не работает (так как IPaddress не имеет конструктор, который принимает строку.

Так как я могу решить эту проблему? (Отображение IP значение с проектные данные)

+0

Возможный дубликат [Как сериализовать классы, включенные в свойство System.Net.IPAddress?] (Http://stackoverflow.com/questions/24139723/how-to-serialize-a-classes-that-included- в-системе-нетто-IPAddress-недвижимость) –

ответ

1

Простым способом является обернуть IPAddress дополнительным string:

public IPAddress IP { get; set; } 
public string StringIP 
{ 
    get 
    { 
     return IP.ToString(); 
    } 
    set 
    { 
     IP = IPAddress.Parse(value); 
    } 
} 

Теперь вы можете использовать обернутый свойство для установки IP:

<nc:ListEntry ID="2" StringIP="192.168.178.255" /> 
1

Создать TypeConverter, который преобразует из string в IPAddress:

using System.ComponentModel; 
... 

public class IPAddressConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(
     ITypeDescriptorContext context, Type sourceType) 
    { 
     return sourceType == typeof(string); 
    } 

    public override object ConvertFrom(
     ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     return IPAddress.Parse((string)value); 
    } 
} 

Зарегистрируйте TypeConverter для IP собственности, как это:

public class ListEntry 
{ 
    public int ID { get; set; } 

    [TypeConverter(typeof(IPAddressConverter))] 
    public IPAddress IP { get; set; } 
}