使用非基本属性实例化XAML对象

时间:2017-02-14 11:04:58

标签: c# .net wpf xaml

我需要编写什么来初始化具有非基本属性的对象。

与拥有以下Model和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值)

2 个答案:

答案 0 :(得分:1)

一种简单的方法是将IPAddress包含一个额外的string属性:

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

现在您可以使用wrapped属性来设置IP:

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

答案 1 :(得分: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; }
}