我ObservableCollection在ViewModel中有一个静态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>
Run Code Online (Sandbox Code Playgroud)
Table包含ListView哪个绑定到MarketList的Property.
<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>
Run Code Online (Sandbox Code Playgroud)
这是转换器方法
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;
}
}
Run Code Online (Sandbox Code Playgroud)
绑定工作正常,但集合中的更新不会反映在UI中
我知道这是旧的,但这是我遇到同样问题时看到的第一个地方.为后代发布解决方案.
这似乎归结为此处描述的相同问题,并且基本上相同的解决方案应该起作用.
更新(添加或删除)ObservableCollection不会导致MultiBinding刷新,因为MultiBinding正在侦听PropertyChanged事件,更新ObservableCollection只会触发CollectionChanged事件.一个干净的解决方法是在MultiBinding中向ObservableCollection的Count属性添加Binding.例如
<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>
Run Code Online (Sandbox Code Playgroud)
在所有现有绑定之后添加附加绑定,以便MultiValueConverter可以忽略额外值.当ObservableCollection的Count属性发生更改时(添加或删除项目时),它将触发PropertyChanged事件,并且MultiBinding将刷新.
小智 5
我正在解决同样的问题,但不仅需要在计数更改时触发,而且还需要在项目修改时触发。Dan 的答案和他链接的答案都让我指出了正确的方向,但一路走来,我发现有一种更好的替代方法来绑定到 Count 属性。相反,绑定到“Item[]”,这将在添加或删除项目(与计数相同)时以及重新排列或更改项目时触发 PropertyChange。
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>
Run Code Online (Sandbox Code Playgroud)
我的来源是 ObservableCollection 的源代码,可以在这里找到:http ://referencesource.microsoft.com/#System/compmod/system/collections/objectmodel/observablecollection.cs
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |