4

コンバーターのプロパティである型のリストを取得する必要がある値コンバーターを使用しています。double 値のリストを使用する場合、次の構文を使用できます (期待どおりに機能しています)。

コード

public class MyConverter : IValueConverter
{
    public List<double> MyList { get; set; }

    // ...
}

XAML

<Converter:MyConverter x:Key="MyConverter">
    <Converter:MyConverter.MyList>
        <System.Double>1</System.Double>
        <System.Double>2</System.Double>
    </Converter:MyConverter.MyList>
</Converter:MyConverter>

しかし、型のリストでこのアプローチを使用しようとすると、例外がスローされます。

Object of type 'System.RuntimeType' cannot be converted to type 'System.Collections.Generic.List`1[System.Type]'

これは私のコンバーターとその使用法です:

コード

public class MyConverter : IValueConverter
{
    public List<Type> MyList { get; set; }

    // ...
}

XAML

<Converter:MyConverter x:Key="MyConverter">
    <Converter:MyConverter.MyList>
        <x:Type TypeName="MyType1" />
        <x:Type TypeName="MyType2" />
    </Converter:MyConverter.MyList>
</Converter:MyConverter>

XAML 構文が間違っていると思いますが、正しい構文が見つかりません。

4

2 に答える 2

2

XAML デザイナーのバグのようです。与えられた以下のコードは私のために働いた。アプリケーションをビルドして実行できます。しかし、デザイナでは、R# はSystem:Typeで 2 つの行を強調表示し、行ごとに次の 2 つのエラーでデザイナがクラッシュします。

エラー 1タイプ 'Type' は、パブリックではないか、パブリックのパラメーターなしのコンストラクターまたは型コンバーターを定義していないため、オブジェクト要素として使用できません。
エラー 2タイプ 'Type' は直接コンテンツをサポートしていません。そのため、以前に(以前のソリューションを提供する前に)そのソリューションを試したとき、私は間違ったことをしていると思いました。ただし、コンパイラはビルド時にエラーを出しません。とにかくここにそれがどのように見えるか:

<Window.Resources>
    <local:Holder x:Key="one">
        <local:Holder.Types>
            <System:Type>System:Int32</System:Type>
            <System:Type>System:Double</System:Type>
        </local:Holder.Types>
    </local:Holder>
</Window.Resources>
<Grid >
    <ListBox DataContext="{StaticResource one}" ItemsSource="{Binding Path=Types, Converter={StaticResource one}}" />
</Grid>

ご覧のとおり、違いは宣言にあります。x:Type ではなく System.Type を使用する必要があります。

サンプルとしてのコード

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Data;
using System.Linq;

namespace stackProjects
{
    public class Holder : IValueConverter
    {
        public List<Type> Types { get; set; }

        public Holder()
        {
            Types=new List<Type>();
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Types.Select(x => x.Name).ToList();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

私が言ったように、これはTypeクラスがabstractであるために起こります。それが役に立てば幸い

于 2012-08-16T10:05:59.270 に答える
1

以下の例をコンパイルして実行すると、コンバーターが呼び出され、リストに 2 つの Type オブジェクトが取り込まれます。おそらくもっと良い方法があります。


私が使用した完全なコードは次のとおりです。

namespace WpfApplication4
{
    public class MyConverter : IValueConverter
    {
        public IList<Type> MyList { get; set; }

        public MyConverter()
        {
            MyList = new List<Type>();
        }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    public class MyType
    {
        public string Name { get; set; }

        public MyType()
        {

        }
    }
}

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication4"
        xmlns:runtime="clr-namespace:System.Runtime.InteropServices;assembly=mscorlib"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <sys:String x:Key="testdata">TestData</sys:String>
        <x:Array x:Key="listoftypes" Type="{x:Type sys:Type}">
            <x:Type Type="local:MyType"/>
            <x:Type Type="local:MyType"/>
        </x:Array>
        <local:MyConverter x:Key="myconv" MyList="{StaticResource listoftypes}"/>
    </Window.Resources>
    <Grid>
        <TextBlock Text="{Binding Source={StaticResource testdata}, Converter={StaticResource myconv}}"/> 
    </Grid>
</Window>
于 2012-08-16T09:30:08.050 に答える