我在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
中答案 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