多绑定时观察集合不更新

时间:2013-08-06 05:37:51

标签: wpf

我在ViewModel中有一个静态ObservableCollection MarketList 它以下列方式绑定到Table

<FlowDocumentScrollViewer Height="216" VerticalAlignment="Top" Margin="-7,2,7,0" >
    <FlowDocument>
        <Table CellSpacing="0" Name="MBPTable"  >
            <Table.DataContext>
                <MultiBinding  UpdateSourceTrigger="Explicit"  Mode="TwoWay" Converter="{StaticResource indexerConverter}">
                    <Binding Path="MarketList" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True" Mode="TwoWay" BindsDirectlyToSource="True"  />
                    <Binding Path="MBPindex"  Mode="TwoWay"   />
                </MultiBinding>
            </Table.DataContext>
        <Table.Resources>
            <local:IndexerConverter x:Key="indexerConverter"></local:IndexerConverter>
        </Table.Resources>

Table包含绑定到MarketList属性的ListView

<ListView  Name="MarketByPriceList" Width="300" ItemsSource="{Binding MarketByPriceList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" AlternationCount="2" Margin="0,15,0,0" >
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Orders"  Width="48"  DisplayMemberBinding="{Binding MBP_NoofBuy_Orders, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" ></GridViewColumn>
            <GridViewColumn Header="Bid Qty" Width="48"  DisplayMemberBinding="{Binding MBPBID_Qty,  UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" ></GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

这是转换器方法

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values != null && values[0] != DependencyProperty.UnsetValue)
        {
           // ObservableCollection<GlobalItems.Model.MarketWatchModel> allNames = (ObservableCollection<GlobalItems.Model.MarketWatchModel>)values[0];
            int index = (int)values[1];

            return GlobalItems.ViewModel.MarketWatchModelView.MarketList[index];
        }
        else
        {
            return null;
        }
    }

绑定工作正常,但集合中的更新未反映在UI

2 个答案:

答案 0 :(得分:5)

我知道这是旧的,但这是我在遇到同样问题时看到的第一个地方。为后代发布解决方案。

这似乎归结为here描述的同一问题,基本上same solution应该有效。

更新(添加或删除)ObservableCollection不会导致MultiBinding刷新,因为MultiBinding正在侦听PropertyChanged事件,更新ObservableCollection只会触发CollectionChanged事件。一个干净的解决方法是在MultiBinding中向ObservableCollection的Count属性添加Binding。 e.g。

<MultiBinding  UpdateSourceTrigger="Explicit"  Mode="TwoWay" Converter="{StaticResource indexerConverter}">
  <Binding Path="MarketList" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True" Mode="TwoWay" BindsDirectlyToSource="True"  />
  <Binding Path="MBPindex"  Mode="TwoWay"   />
  <Binding Path="MarketList.Count" /> <!-- Additional Binding causes refresh when MarketList is updated -->
</MultiBinding>

在所有现有绑定之后添加附加绑定,以便MultiValueConverter可以忽略额外值。当ObservableCollection的Count属性发生更改时(添加或删除项目时),它将触发PropertyChanged事件,并且MultiBinding将刷新。

答案 1 :(得分:3)

我正在对同一问题进行故障排除,但不仅需要在计数发生变化时触发,还需要在项目被修改时触发。 Dan的回答和他联系的那个让我指出了正确的方向,但是在我发现的方式中,有一个更好的选择来绑定Count属性。绑定到&#34;项目[]&#34;相反,它会在添加或删除项目时触发PropertyChange(与Count相同),但也会在重新排列或更改项目时触发。

Dan的例子的更新版本:

<MultiBinding  UpdateSourceTrigger="Explicit"  Mode="TwoWay" Converter="{StaticResource indexerConverter}">
  <Binding Path="MarketList" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True" Mode="TwoWay" BindsDirectlyToSource="True"  />
  <Binding Path="MBPindex"  Mode="TwoWay"   />
  <Binding Path="MarketList.Item[]" /> <!-- This is the difference -->
</MultiBinding>

我的来源是ObservableCollection的源代码,可在此处找到:http://referencesource.microsoft.com/#System/compmod/system/collections/objectmodel/observablecollection.cs