IValueConverters and MockData

3
我正在尝试创建一个IValueConverter,它接收一个枚举并输出一个URI。转换器在运行时按预期工作。然而,XAML设计器会报错:
对象必须与枚举相同。传入的类型为'Mocks.WarframeHelper_Model_Enumerations_15_1293735+RelicTypes',而枚举类型为'WarframeHelper.Model.Enumerations+RelicTypes'。
我有一个简化版的模型,其中只有我在设计时需要的属性,但是使用的枚举应该完全相同(或者至少应该是)。有没有什么办法解决这个问题。
下面是IValueConverter的代码(如果我做错了什么,请随便指正):
public class NameToUriConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(Enum.IsDefined(typeof(Enumerations.RelicTypes), value))
        {
            return new Uri("/Assets/RelicIcons/Relic_" + (value).ToString() + ".png", UriKind.Relative);
        }
        else return new Uri("/Assets/Placeholder.png", UriKind.Relative);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value as string;
    }
}

以下是我用于模拟数据的自定义数据类型:

public class Sample_RelicModel
{
    public Uri ImageUri { get; set; }
    public bool isVaulted { get; set; }
    public Enumerations.RelicFlavors Flavor { get; set; }
    public Enumerations.RelicTypes Type { get; set; }
    public Enumerations.DropRearity Rearity { get; set; }
    public ObservableCollection<Sample_PrimeItem_Component> DropTable { get; set; }
    private int count;
    public int Count
    {
        get { return count; }
        set
        {
            if (value >= 0)
            {
                count = value;
            }
            else MessageBox.Show("You don't have enough relics", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }
    public Sample_RelicModel() { }
}

转换器在运行时正常工作,但由于模拟数据,XAML设计器不喜欢它。


大小写是否匹配?请查看此处的备注 https://msdn.microsoft.com/en-us/library/system.enum.isdefined(v=vs.110).aspx - Nkosi
1
@Nkosi 这就是问题所在,它们不匹配。运行时枚举的类型是(Enumerations+RelicTypes),但设计时枚举的类型是(Enumerations_15_1293735+RelicTypes),这就是问题的来源。我可以确认运行时数据类型和设计时数据类型都有一个“using Project.Model”(其中包含Enumerations),因此除非Visual Studio基于我创建的数据类型创建自己的数据类型,否则它们应该是相同的类型。 - EnvelopedDevil
我在询问传递给转换器的值的情况。为了进行故障排除,请在传递给 Enum.IsDefined 之前将该值转换为字符串并查看是否有效。例如 Enum.IsDefined(typeof(Enumerations.RelicTypes), value.ToString()) - Nkosi
@Nkosi 是的,那就解决了,请将其发布为答案,这样我就可以标记它。 - EnvelopedDevil
@Nkosi 当设计师现在工作并且错误已经消失时,预期结果在设计时没有看到。在这种情况下,这是正常行为吗? - EnvelopedDevil
显示剩余2条评论
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接