【问题标题】:WPF databinding and convertersWPF 数据绑定和转换器
【发布时间】:2009-10-21 20:05:42
【问题描述】:

我正在尝试像这样将数据绑定到列表框:

<ListBox x:Name="MyListBox" Margin="0,0,0,65">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource MyConverter}}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我绑定到整个对象而不是属性的原因是因为我的转换器需要对象的多个属性来构建它返回的字符串。

这有效,我的字符串被返回。但是,当我更改基于该值的 ObservableCollection 时,屏幕上的值不会改变。如果我只绑定到一个属性并对其进行更改,那么值确实会更改。

我可以做些什么不同的事情?我无法绑定到单个属性,因为我需要转换器中的整个对象...而且 ConverterParameter 已被使用。

【问题讨论】:

  • 如果我在我的对象周围创建一个包装器,该包装器使用我的对象的单个属性实现 INotifyPropertyChanged,我可以让它工作。然后绑定到该属性。但是我还需要让包装器实现一个方法,以便在我更改集合时显式调用,以便事件可以调用 PropertyChanged... 看起来像一个可怕的 hack...

标签: wpf data-binding converter


【解决方案1】:

请记住,如果您绑定到“主”属性并且主属性本身的值没有更改,则绑定将没有理由刷新自身。它不知道您的转换器实际上是基于子属性的。您可以做的是使用MultiBinding,您不仅可以绑定“主”属性,还可以绑定特定的子属性。这使您的 IMultiValueConverter 实现可以访问主数据对象,但由于您还绑定到正在更改的子属性,因此当该子属性的值更改时也会刷新。

【讨论】:

  • 哦,好主意..从来没有想过那个。我试试看。
  • 完美运行!谢谢,我在这一天的大部分时间里一直在努力解决这个问题..
【解决方案2】:

您可以尝试使用MultiBinding,我相信只要触发它的任何绑定就会更新。您也可以使用 IMultiValueConverter 或仅利用绑定的 StringFormat。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2012-08-11
    相关资源
    最近更新 更多