【问题标题】:WPF: IValueConverter with ListWPF:带列表的 IValueConverter
【发布时间】:2012-06-02 02:51:13
【问题描述】:

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

                    <MenuItem Header="{Binding Path=DataContext.Documents, RelativeSource={RelativeSource FindAncestor,
    AncestorType={x:Type ListView}}, Converter={StaticResource DocumentsToString}, Mode=OneWay}">
                    <MenuItem.Icon>
                        <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/>
                    </MenuItem.Icon>
                </MenuItem>

还有 ValueConverters.cs

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();
    }
}

【问题讨论】:

  • 转换器仅在Documents 属性获得新值时调用;如果Documents 属性引用的集合保持不变,则不会调用转换器,即使Document 项目已添加到该集合。您真的想将所有文档名称写入一个MenuItem 吗?或者您想为每个文档创建一个MenuItem?如果是后者,请将您的收藏分配给Menu.ItemsSource
  • 我使用 Document.SelectedCount 并且如果我单击 Document 中的另一个项目,它会再次调用转换器

标签: wpf data-binding ivalueconverter


【解决方案1】:

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

<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。默认情况下,它是一个垂直 StackPanel。您可以像这样将其更改为 Horizo​​ntal StackPanel:

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

然后,您可以为每个 TextBlock 项添加间距或边距,以实现您想要的视觉效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多