Переключить шаблон данных на основе значения связанных данных в Silverlight / WPF

говорят, что я использую WPF или Silverlight и привязываю ContentPresenter к целочисленному свойству:

<ContentPresenter Content={Binding Score} />

, и если оценка равна 10, я хочу отобразить золотую звезду, а в противном случае просто отобразить число. По сути, у меня есть два возможных шаблона данных:

<Path Fill="Gold" Data="..." />

<TextBlock Text="{Binding Score}" />

Как лучше всего это настроить? Нужно ли использовать конвертер привязки? Или выполнить привязку к другому объекту, который динамически загружает соответствующий шаблон данных xaml и делает правильный FrameworkElement в зависимости от значения Score? Или есть еще один трюк, который мне не хватает - возможно, ContentPresenter не тот элемент управления, который нужно использовать?

Я подумал, можно ли сделать что-то подобное, но ему не нравится вложенная привязка в значении ContentTemplate: {общедоступный статический Func AsDelegate (это значение T) {return () => значение; ...

Рассмотрите этот фрагмент кода и попытайтесь угадать, что y1 и y2 оценивают как

static class Extensions
{
    public static Func<T> AsDelegate<T>(this T value)
    {
        return () => value;
    }
}
class Program
{
    static void Main(string[] args)
    {
        new Program();
    }

    Program()
    {
        double x = Math.PI;

        Func<double> ff = x.AsDelegate();
        Func<double> fg = () => x;

        x = -Math.PI;

        double y1 = ff();  // y1 = 3.141..
        double y2 = fg();  // y2 = -3.141..

    }
}

. Вы можете сказать -Aha- double - это тип значения, а значит, значение метод расширения возвращает копию основного x . Но когда вы измените вышеупомянутое на делегатов классов, результаты все равно будут другими. Пример:

class Foo
{
    public double x;
}
    Program()
    {
        Foo foo = new Foo() { x=1.0 };

        Func<Foo> ff = foo.AsDelegate();
        Func<Foo> fg = () => foo;

        foo = new Foo() { x = -1.0 };

        double y1 = ff().x;    // y1 = 1.0
        double y2 = fg().x;    // y2 = -1.0
    }

Таким образом, две функции должны возвращать два разных экземпляра одного и того же класса. Интересно отметить, что ff () несет в себе ссылку на локальную переменную foo , а fg () - нет, и полагается на то, что находится в объем в настоящее время.

Так что же происходит, когда эти два делегата передаются другим частям кода, которые не видны для экземпляра foo ? Почему-то вопрос о том, кому принадлежит какая информация (данные), становится все менее и менее ясным, когда методы расширения объединяются с делегатами.

5
задан ja72 9 November 2010 в 17:59
поделиться