2010-04-07 75 views
2

我有一個ViewModels的集合,並希望將一個ListBox綁定到它們。做一些調查我發現this在WPF中綁定列表框

所以我的視圖模型是這樣的(僞代碼)

interface IItemViewModel 
{ 
string DisplayName { get; } 
} 

class AViewModel : IItemViewModel 
{ 
string DisplayName { return "foo"; } 
} 

class BViewModel : IItemViewModel 
{ 
string DisplayName { return "foo"; } 
} 

class ParentViewModel 
{ 
IEnumerable<IItemViewModel> Items 
{ 
    get 
    { 
    return new IItemViewModel[] { 
    new AItemViewModel(), 
    new BItemViewModel() 
    } 
    } 
} 
} 

class GroupViewModel 
{ 
static readonly GroupViewModel GroupA = new GroupViewModel(0); 
static readonly GroupViewModel GroupB = new GroupViewModel(1); 

int GroupIndex; 
GroupViewModel(int groupIndex) 
{ 
    this.GroupIndex = groupIndex; 
} 

string DisplayName 
{ 
    get { return "This is group " + GroupIndex.ToString(); } 
} 
} 

class ItemGroupTypeConverter : IValueConverter 
{ 
object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value is AItemViewModel) 
    return GroupViewModel.GroupA; 
    else 
    return GroupViewModel.GroupB; 
} 
} 

這XAML

<UserControl.Resources> 
<vm:ItemsGroupTypeConverter x:Key="ItemsGroupTypeConverter "/> 
<CollectionViewSource x:Key="GroupedItems" Source="{Binding Items}"> 
    <CollectionViewSource.GroupDescriptions> 
    <PropertyGroupDescription Converter="{StaticResource ItemsGroupTypeConverter }"/> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 
</UserControl.Resources> 
<ListBox ItemsSource="{Binding Source={StaticResource GroupedItems}}"> 
<ListBox.GroupStyle> 
    <GroupStyle> 
    <GroupStyle.HeaderTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding DisplayName}" FontWeight="bold" /> 
    </DataTemplate> 
    </GroupStyle.HeaderTemplate> 
    </GroupStyle>    
</ListBox.GroupStyle> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding DisplayName}" /> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

這工作不知何故,exept的事實HeaderTemplate中的結合不起作用。無論如何,我寧願省略TypeConverter和CollectionViewSource。沒有辦法將ViewModel的屬性用於分組嗎?

我知道在這個示例場景中,用一個字符串替換GroupViewModel會很容易,但這不是一個選項。那麼如何將HeaderTemplate綁定到GroupViewModel?

回答

10

好吧,我終於自己解決了。

首先,TypeConverter是不必要的,因爲PropertyGroupDescription可以綁定在PropertyName上。所以我加了屬性「組」,以IItemViewModel和修改XAML如下:

<UserControl.Resources> 
<CollectionViewSource x:Key="GroupedItems" Source="{Binding Items}"> 
    <CollectionViewSource.GroupDescriptions> 
    <PropertyGroupDescription PropertyName="Group"/> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 
</UserControl.Resources> 

此外,HeaderTemplate中的DataContext的是CollectionViewGroupInternal和綁定有看起來像這樣:

<DataTemplate> 
<TextBlock Text="{Binding Name.DisplayName}" FontWeight="bold" /> 
</DataTemplate> 

這裏CollectionViewGroupInternal.Name解析實際的GroupViewModel。

+1

爲什麼在文本塊的文本綁定部分中使用Name.DisplayName?你從哪裏得到「姓名」的對象? – Miles 2010-10-07 14:41:15

+1

Name是CollectionViewGroupInternal的參數 – 2010-10-24 09:20:51