говорят, что я использую WPF или Silverlight и привязываю ContentPresenter к целочисленному свойству:
<ContentPresenter Content={Binding Score} />
, и если оценка равна 10, я хочу отобразить золотую звезду, а в противном случае просто отобразить число. По сути, у меня есть два возможных шаблона данных:
<Path Fill="Gold" Data="..." />
<TextBlock Text="{Binding Score}" />
Как лучше всего это настроить? Нужно ли использовать конвертер привязки? Или выполнить привязку к другому объекту, который динамически загружает соответствующий шаблон данных xaml и делает правильный FrameworkElement в зависимости от значения Score? Или есть еще один трюк, который мне не хватает - возможно, ContentPresenter не тот элемент управления, который нужно использовать?
Я подумал, можно ли сделать что-то подобное, но ему не нравится вложенная привязка в значении ContentTemplate:
{общедоступный статический Func Рассмотрите этот фрагмент кода и попытайтесь угадать, что . Вы можете сказать -Aha- double - это тип значения, а значит, значение метод расширения возвращает копию основного Таким образом, две функции должны возвращать два разных экземпляра одного и того же класса. Интересно отметить, что Так что же происходит, когда эти два делегата передаются другим частям кода, которые не видны для экземпляра 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..
}
}
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
? Почему-то вопрос о том, кому принадлежит какая информация (данные), становится все менее и менее ясным, когда методы расширения объединяются с делегатами.