我有一个listview,其中是groupstyle,我已经定义了一个扩展器(下面的代码),我以编程方式将很多项添加到listview中,这些项被添加到适当的扩展器中,如果新项目不存在扩展器,它会得到动态创建。
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True" >
<Expander.Header>
<DockPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100"/>
</DockPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
所以需要做的是,当添加一个新项目时,焦点应该转移到该项目,扩展器应该在展开的同时折叠所有其他...
答案 0 :(得分:6)
我想扩展之前的答案 - 我在MVVM场景中使用它,并且得到了与Billy上面提到的相同的错误
“A'Binding'不能在'Binding'类型的'ConverterParameter'属性上设置。'Binding'只能在DependencyObject的DependencyProperty上设置。”
我最终修改了转换器和XAML(DataContext.CurrentItem是占位符,用于引用视图模型中当前项所需的任何内容):
public class MultiBindingItemsEqualConverter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
bool valuesEquals = values[0].Equals(values[1]);
return valuesEquals;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
<Expander ...>
<Expander.IsExpanded>
<MultiBinding
Mode="OneWay"
Converter="{StaticResource MultiBindingItemsEqualConv}">
<Binding
RelativeSource="{RelativeSource FindAncestor, AncestorType=ListView, AncestorLevel=1}"
Path="SelectedItem"></Binding>
<Binding
RelativeSource="{RelativeSource FindAncestor, AncestorType=ListView, AncestorLevel=1}"
Path="DataContext.CurrentItem"></Binding>
</MultiBinding>
</Expander.IsExpanded>
</Expander>
答案 1 :(得分:1)
使用绑定查看列表SelectedItem是否是我们绑定的组的一部分。
<Expander IsExpanded="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListView, AncestorLevel=1}, Path=SelectedItem, Converter={StaticResource yourConverter}, ConverterParameter={Binding}}" >
您将IsExpanded绑定到列表SelectedItem,其中一个转换器参数绑定到viewmodel并让转换器只检查参数是否匹配。
转换器只返回true或false
public class yourConvertor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((GroupItem)parameter).Contains(value);
}
}