0

これにより、コンボボックスにわかりやすい名前が表示されないようです。何が間違っているのかわかりません。

<ComboBox ItemsSource="{Binding MyTypes, Mode=OneTime}"
          SelectedItem="{Binding SelectedType}"/>
public sealed class MyType : IMyInterface
{
    public override string ToString()
    {
        return "Friendlier Name";
    }
}

IValueConverterまた、私は(うまくいかなかった)を使用しようとしました...

<ComboBox ItemsSource="{Binding MyTypes, Mode=OneTime}"
          MemberDisplayPath="{Binding Converter={StaticResource MyConverter}}"
          SelectedItem="{Binding SelectedType}"/>
[ValueConversion(typeof(Type), typeof(String))]
public sealed class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var type = value as Type;

        if (type == null)
        {
            return DependencyProperty.UnsetValue;
        }

        return type.ToString();
    }

    ...
}

問題は、IValueConverter が渡される値として ViewModel のみを取得するように見えることです...そこで何が起こっているのかわかりません。

4

3 に答える 3

2

私はあなたのためにあなたを修正しました...オブジェクトにIValueConverterバインドしている限り、インスタンスを作成し、代わりにそのインスタンスでオーバーライドを使用する必要があります。クラスにクレイジーな構築ロジックがある場合、これは面倒になる可能性があることに注意してください。TypeToString()

[ValueConversion(typeof(Type), typeof(String))]
internal sealed class TypeNameConverter : IValueConverter
{
    private static readonly IDictionary<Type, string> TypeNameCache = new Dictionary<Type, string>();
    private static readonly object TypeNameCacheLock = new Object();

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var type = value as Type;

        if (type == null)
        {
            return DependencyProperty.UnsetValue;
        }

        string result;

        lock (TypeNameCacheLock)
        {
            if (!TypeNameCache.TryGetValue(type, out result))
            {
                var instance = Activator.CreateInstance(type);

                result = instance.ToString();

                TypeNameCache.Add(type, result);
            }
        }

        return result;
    }

    ...
}

この部分はHBの回答からコピーされたもので、機能するために必要です:)

<ComboBox.ItemTemplate>
    <DataTemplate>
         <TextBlock Text="{Binding Converter={StaticResource MyConverter}}"/>
    </DataTemplate>
</ComboBox.ItemTemplate>
于 2012-05-14T15:45:39.023 に答える
2

a を使用してDataTemplate、そこにコンバーターを適用します。

<ComboBox.ItemTemplate>
    <DataTemplate>
         <TextBlock Text="{Binding Converter={StaticResource MyConverter}}"/>
    </DataTemplate>
</ComboBox.ItemTemplate>
于 2012-05-14T15:24:51.947 に答える
0

使用しているプロパティは実際には と呼ばれDisplayMemberPath、コードが示唆するよりもはるかに簡単に機能します。

コードを次のように変更します。

public sealed class MyType : IMyInterface
{
    public string FriendlyName
    {
        get { return "Friendlier Name"; }
    }
}

次に、Xaml セットDisplayMemberPath="FriendlyName"で完了です。

(コンバーターを捨てることをお勧めします。クラス全体を文字列値に変換する場合は、通常、より簡単な方法があります。)

于 2012-05-14T15:26:55.707 に答える