2

我有一个列表视图,其中是 groupstyle,我已经定义了一个扩展器(下面的代码),我以编程方式将许多项目添加到列表视图中,这些项目将添加到适当的扩展器中,如果新项目不存在扩展器,它会被动态创建。

<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>

所以需要做的是,当添加一个新项目时,焦点应该转移到那个项目上,并且应该在折叠所有其他内容的同时展开扩展器......

4

2 回答 2

7

我想扩展上一个答案——我在 MVVM 场景中使用它,并且遇到了与上面提到的比利相同的错误

“不能在“Binding”类型的“ConverterParameter”属性上设置“Binding”。只能在 DependencyObject 的 DependencyProperty 上设置“Binding”。”

我最终修改了转换器和 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>
于 2012-10-15T15:37:34.053 回答
2

使用绑定来查看列表 SelectedItem 是否是我们绑定到的 Group 的一部分。

<Expander IsExpanded="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListView, AncestorLevel=1}, Path=SelectedItem, Converter={StaticResource yourConverter}, ConverterParameter={Binding}}" >

您将使用绑定到视图模型的转换器参数将 IsExpanded 绑定到列表 SelectedItem,并让转换器简单地检查参数是否匹配。

转换器只返回 true 或 false

public class yourConvertor : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((GroupItem)parameter).Contains(value);
    }
 }
于 2012-09-07T13:59:42.817 回答