У меня есть Listbox, привязанный к наблюдаемому набору, на котором отображается другое изображение в зависимости от данных в нем, например:
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="PersonTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image Source="{Binding Path=ImagePath}"/>
<TextBlock x:Name="id" Text="{Binding Id}" Grid.Column="1"/>
</Grid>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
Затем я использую его позже:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox x:Name="personListBox" ItemTemplate="{StaticResource PersonTemplate}"
ItemsSource="{Binding PersonCollection}"/>
</Grid>
Однако это означает, что я создал свойство ImagePath как часть Person, что на самом деле не правильно, поскольку оно является частью ViewModel, а не модели. Можно ли как-то добавить привязку в ViewModel, чтобы я мог передать идентификатор в изменение изображения соответственно?
EDIT:
Я действительно после некоторой игры нашел способ сделать это, но я не уверен, что это разумный подход. Я создал ValueConverter и использовал его для изменения значения.
public class IdToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int id = (int)value;
string img;
switch (id)
{
case 1: img = @"Resources/Image/image1.png"; break;
case 2: img = @"Resources/Image/image2.png"; break;
default: img = @"Resources/Image/unknown.png"; break;
}
return img;
}
Тогда это работает:
<phone:PhoneApplicationPage.Resources>
<local:IdToImageConverter x:Key="IdImageConverter"/>
<DataTemplate x:Key="PersonTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image Source="{Binding Id,Converter={StaticResource IdImageConverter}}"/>
<TextBlock x:Name="id" Text="{Binding Id}" Grid.Column="1"/>
</Grid>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>