WPF:IValueConverter与列表

WPF:IValueConverter与列表,wpf,data-binding,ivalueconverter,Wpf,Data Binding,Ivalueconverter,可以将IValueConverter与列表一起使用。它可以在我第一次调用菜单时使用。当我更新列表中的项目时,它不会再次调用IValueConverter? 例如: 及 public class ListDocumentToStringConverter: IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {

可以将IValueConverter与列表一起使用。它可以在我第一次调用菜单时使用。当我更新列表中的项目时,它不会再次调用IValueConverter? 例如:


public class ListDocumentToStringConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var selectedDocuments = (ObservableCollection<Document>) value;
        var result = "";
        foreach (var document in selectedDocuments)
        {
            result += document.Name + "\t";
        }
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类ListDocumentToStringConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
var selectedDocuments=(ObservableCollection)值;
var结果=”;
foreach(选定文档中的var文档)
{
结果+=文件名+“\t”;
}
返回结果;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}

要在fmunkert的评论中添加正确的内容,如果您打算在一个菜单项中托管所有这些项目,您可以编写如下内容:

<MenuItem>
    <MenuItem.Header>
        <ItemsControl ItemsSource="{Binding Path=DataContext.Documents, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </MenuItem.Header>
    <MenuItem.Icon>
        <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/>
    </MenuItem.Icon>
</MenuItem>

这样,您根本不必使用转换器。如果要更改这些项彼此之间的布局方式,例如在示例中使用中间的选项卡,则需要对ItemsControl的ItemsPanel进行模板化。默认情况下,它是垂直堆叠面板。您可以将其更改为水平堆叠面板,如下所示:

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal" />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>


然后,您可以为每个文本块项添加间距或边距,以实现所需的视觉效果。

仅当
Documents
属性获得新值时,才会调用转换器;如果
文档
属性所引用的集合保持不变,则不会调用转换器,即使
文档
项已添加到该集合中。是否确实要将所有文档名称写入一个
菜单项
?还是要为每个文档创建一个
MenuItem
?如果是后者,请将您的收藏分配到
菜单.ItemsSource
。我使用Document.SelectedCount,如果我单击文档中的另一项,它将再次调用converter
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal" />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>