這是我能想到的最好的方式來說明我的問題,這裏是場景:我有一個ListView
綁定到對象的集合。每個對象都有一個屬性UserID
,它只是對象User
的參考ID。在我的ListView
我希望顯示對象和User
的多個屬性。爲此,我創建了一個實現MultiValueConverter
的類來充當用戶對象的查找表。因此,我使用多值綁定,通過值轉換器UserID
和底層ViewModel公開的字典查找表。無論如何設置由ListView列共享的行'DataContext'?
這一切都工作正常和丹迪,除非我希望有一種方法,我可以設置DataContext
或ListView
列共享'行'的東西。通過這種方式,我可以將我的值轉換器更改爲僅返回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
}
在這一點上,我認爲我的非UI層只是不適合構思,所以我只是要重新做它們,以便我可以在我的數據對象中使用User對象引用。 – 2010-11-24 18:06:42