Подтвердить что ты не робот

Silverlight меняет стили на основе значения свойства объекта (т.е. DataTrigger)

Есть ли у кого-нибудь успешное решение об изменении стиля в silverlight на основе свойства базового объекта данных, поскольку при изменении значения так меняется и стиль. Я кратко использовал WPF и, очевидно, имеет DataTrigger, который, похоже, охватывает это, но в Silverlight отсутствует.

Я нашел это: http://blois.us/blog/2009/04/datatrigger-bindings-on-non.html

Но это не похоже на стиль.

Спасибо за ваше время

4b9b3361

Ответ 1

Silverlight не содержит DataTemplateSelector, который используется для выбора шаблона данных на основе связанного с данными элемента и объект данных. Но, нетрудно построить свой собственный.

Начните с класса, который наследует от System.Windows.Controls.ContentControl. Этот класс имеет свойство для шаблона данных и свойство для контента, к которому вы можете использовать привязку. Создайте переопределение в методе OnContentChanged, подобном этому

protected override void OnContentChanged(object oldContent, object newContent) 
{
}

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

Switch(DataStatus){
  case 0: ContentTemplate = LoadFromDictionary(
                                "DataTemplateDemo;component/DataTemplates.xaml",
                                "Status0Template");
          break;
  case 1: ContentTemplate = LoadFromDictionary(
                                "DataTemplateDemo;component/DataTemplates.xaml", 
                                "Status1Template");
          break;
   //etc      
}

в этом случае должно быть имя словаря DataTemplates.xaml с паролем шаблонов данных.

В вашем файле xaml используйте класс выбора шаблона в качестве шаблона списка:

 <ListBox x:Name="AnInterrestingList">
    <ListBox.ItemTemplate>
    <DataTemplate>
        <DataTemplateDemo:DateTemplateSelector Content="{Binding}"/>
    </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Я использую этот вспомогательный метод, как показано ниже, для возврата шаблонов из словарей:

public static DataTemplate LoadFromDictionary(string dictionary,
                                              string template)
{
    var doc = XDocument.Load(dictionary);
    var dict = (ResourceDictionary)XamlReader
                     .Load(doc.ToString(SaveOptions.None));
    return dict[template] as DataTemplate;
}

Обновление

Тем временем я написал блогпост с образцом кода по этому вопросу. Он доступен на мой блог.