[WPF, Binding] Забиндить картинку в зависимости от типа объ
От: skodnik  
Дата: 28.12.10 07:46
Оценка:
Есть TreeView, у него есть шаблон для отображения нодов

<sdk:HierarchicalDataTemplate ItemsSource="{Binding Child}">
<StackPanel Orientation="Horizontal">
<Image Source="????????"/>
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</sdk:HierarchicalDataTemplate>

У элемента, который биндится к Item есть не только свойство Name, но есть еще и свойство Type.
Как в биндинге прописать, что если Type == type1, то Image Source="type1.jpg", а если Type == type2 то Source="type2.jpg"?
Re: [WPF, Binding] Забиндить картинку в зависимости от типа
От: Codechanger Россия  
Дата: 28.12.10 08:02
Оценка: 2 (1)
Здравствуйте, skodnik, Вы писали:

S>Есть TreeView, у него есть шаблон для отображения нодов


S>

S><sdk:HierarchicalDataTemplate ItemsSource="{Binding Child}">
S> <StackPanel Orientation="Horizontal">
S> <Image Source="????????"/>
S> <TextBlock Text="{Binding Path=Name}" />
S> </StackPanel>
S></sdk:HierarchicalDataTemplate>

S>У элемента, который биндится к Item есть не только свойство Name, но есть еще и свойство Type.
S>Как в биндинге прописать, что если Type == type1, то Image Source="type1.jpg", а если Type == type2 то Source="type2.jpg"?

Варианты следующие:

1. Триггер.
2. Custom markup extension.
3. Конвертер.

Если типов много, то лучше конвертер. Если берете из ресурсов , то вариант 2. Триггер неплохо использовать, когда 2-3 варианта.
Re[2]: [WPF, Binding] Забиндить картинку в зависимости от т
От: skodnik  
Дата: 28.12.10 09:17
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>3. Конвертер.


То что надо! Просто не знал че гуглить. Спасибо.
Re: [WPF, Binding] Забиндить картинку в зависимости от типа
От: cybosser Россия  
Дата: 28.12.10 12:13
Оценка:
Здравствуйте, skodnik, Вы писали:

S>Есть TreeView, у него есть шаблон для отображения нодов


S>

S><sdk:HierarchicalDataTemplate ItemsSource="{Binding Child}">
S> <StackPanel Orientation="Horizontal">
S> <Image Source="????????"/>
S> <TextBlock Text="{Binding Path=Name}" />
S> </StackPanel>
S></sdk:HierarchicalDataTemplate>

S>У элемента, который биндится к Item есть не только свойство Name, но есть еще и свойство Type.
S>Как в биндинге прописать, что если Type == type1, то Image Source="type1.jpg", а если Type == type2 то Source="type2.jpg"?

Можно также использовать паттерн MVVM.

Создаете класс, представляющий модель (M):

// Model.cs

enum ModelType { One, Two }

class Model {
  // ...
  public string Name { get; set; }
  public ModelType Type { get; }
  // ...
}


Создаете модель представления (VM), основное назначение которой — это предоставление данных для привязки:

// ViewModel.cs
class ViewModel {
  private readonly Model _model;
  
  public ViewModel(Model model)
  {
     _model = model;
  }

  public string Name { 
    get { return _model.Name; }
    set { /**/ }
  }
  
  public Uri ImageSource 
  {
    get 
    {
       switch(_model.Type)
       {
         case ModelType.One:
           return new Uri(/*Uri первой картинки*/);
         case ModelType.Two:
           return new Uri(/*Uri второй картинки*/);
       }

       throw new NotImplementedException();
    }
  }
}


Представление(V) непосредственно содержится в XAML:

<!-- View.xaml -->
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Child}">
  <StackPanel Orientation="Horizontal">
    <Image Source="{Binding ImageSource}"/>
    <TextBlock Text="{Binding Name}" />
  </StackPanel>
</sdk:HierarchicalDataTemplate>
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. Мартин Фаулер
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.