【问题标题】:WPF: Bind DisplayMemberPath in a combobox to the ItemWPF:将组合框中的 DisplayMemberPath 绑定到项目
【发布时间】:2009-07-27 21:41:55
【问题描述】:

好的,这有点奇怪,但这基本上是我需要做的。我有一个绑定到 Document 对象的 WPF 控件。 Document 对象有一个 Pages 属性。所以在我的 ViewModel 中,我有一个 CurrentDocument 属性和一个 CurrentPage 属性。

现在,我有一个已绑定到 CurrentDocument.Pages 属性并更新 CurrentPage 属性的组合框。

<ComboBox ItemsSource="{Binding CurrentDocument.Pages}"
    DisplayMemberPath="???"
    SelectedItem="{Binding CurrentPage, Mode=TwoWay}">
</ComboBox>

到目前为止和我在一起?所有这一切都很好,除了我需要 DisplayMemberPath 来显示“第 1 页”、“第 2 页”等.....

我尝试创建这样的转换器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    string pageNumber = "Page {0}";
    return string.Format(pageNumber, value);
}

并尝试像这样将 DisplayMemberPath 绑定到它:

DisplayMemberPath="{Binding RelativeSource={RelativeSource Self}, Path=Index, Converter={StaticResource pgTitleConv}}"

但它仍然不会出现在组合框文本中!!!

没有“索引”属性,但我不知道如何执行此操作...如何访问组合框绑定到的项目的索引...??????

【问题讨论】:

    标签: wpf data-binding combobox


    【解决方案1】:

    试试这个:

    <ComboBox.ItemTemplate>
      <DataTemplate>
        <TextBlock Text="{Binding Converter={StaticResource pgTitleConv}}"/>
      </DataTemplate>
    </ComboBox.ItemTemplate>
    

    并且在您的 valueconverter 中,如果您可以访问 pages 集合,则可以使用 CurrentDocument.Pages.IndexOf(value) 来获取绑定项目的索引。我相信有更好的方法。

    【讨论】:

    • 有效,但使用转换器会影响性能。我在上面进行了调整以使用绑定 StringFormat 功能。例如。
    • @Darren 只是好奇,有多少性能差异?你是怎么测量的?格式字符串中的页面索引在哪里?
    • 他的示例显示他正在格式化一个 int 值(页码/索引)“string.Format(pageNumber, value);”。您的示例演示了您无需提供元素名称 (Path=) 即可获取 int 值。因此,使用 Binding 的字符串格式化程序选项在其前面添加“Page”文本很容易(我正在做“Week x”)。
    • 性能:使用自己的格式化函数获取绑定以格式化值会减少代码。我可能是错的,但我认为调用和执行外部值转换器会添加更多代码。我投票赞成你的答案,因为它表明你不需要元素名称,这让我很困惑。
    • @Darren 更多代码并不一定意味着更差的性能。但是,您将如何仅使用 StringFormat 获得其父集合中页面的索引?我的意思是我更喜欢 StringFormat 尽可能,但对于这种情况,它不能真正取代转换器。
    【解决方案2】:

    好的,感谢 Botz3000,我想出了如何做到这一点。 (它有点假,但效果很好。)

    我突然想到:Page 对象有一个 Document 对象!!哇!!

    所以,我的PageTitleConvert 就是这样做的:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            ImGearPage page = (ImGearPage)value;
            ImGearDocument doc = page.Document;
            int pageIndex = doc.Pages.IndexOf(page);
            pageIndex++;
            return string.Format("Page {0}", pageIndex);
        }
        return null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      相关资源
      最近更新 更多