Это лучший способ сформулировать мой вопрос, вот сценарий: у меня ListView
привязан к коллекции объектов. Каждый из этих объектов имеет свойство UserID
, которое является просто ссылочным идентификатором объекта User
. В моем ListView
я хочу отобразить несколько свойств как объекта, так и User
. Для этого я создал класс, который реализует MultiValueConverter
, чтобы служить таблицей поиска для пользовательских объектов. Поэтому я использую мультисвязывание, которое передает преобразователю значений UserID
, и таблицу поиска по словарю, которая предоставляется базовым ViewModel.
Это все работает отлично и отлично, за исключением того, что я надеюсь, что есть способ, которым я мог бы установить DataContext
или что-то из 'строки', которую разделяют столбцы ListView
. Таким образом, я мог бы изменить свой конвертер значений так, чтобы он просто возвращал объект User вместо конкретных свойств объекта user. И тогда я мог бы просто связать свойства этого DataContext
. Я не хочу создавать новый конвертер значений для каждого пользовательского свойства, которое я хочу показать. Единственный способ сделать это - передать имена свойств в конвертер значений и использовать отражение.
Есть идеи? Я понимаю, что этот DataContext
, о котором я мечтаю, - это работа объектов данных, связанных с ListView
ItemsSource
, но, возможно, я мог бы использовать и кое-что еще. Прикрепленные свойства, кажется, решают все проблемы WPF, которые у меня есть, поэтому я держу пари, что решение будет связано с использованием AttachedProperty
для создания этого 'datacontext'
Я уверен, что кто-то скажет мне выставить объект User из самих объектов данных вместо использования какого-то обратного метода использования идентификаторов пользователя и таблицы поиска, НО, я делаю это по причине. спасибо.
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.Header>User</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock MinWidth="120">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource UserIDConverter}">
<Binding Path="UserID" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=UserControl}" Path="DataContext.Users"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
Конвертер:
public class UserIDConverter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
int userId = (int)values[0];
IDictionary<int, PhoneUser> table = values[1] as IDictionary<int, PhoneUser>;
if (table.ContainsKey(userId))
{
PhoneUser user = table[userId];
return user.LastName;
//I'd like to just return user !!
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}