2

ViewModelに静的なObservableCollectionMarketList があり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>

TableListViewMarketList の 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>

This Is Converter メソッド

    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 に反映されない

4

2 に答える 2

5

同じ問題のトラブルシューティングを行っていましたが、カウントが変更されたときだけでなく、アイテムが変更されたときにも起動する必要がありました。ダンの答えと彼がリンクした答えの両方が正しい方向を示してくれましたが、途中で、Count プロパティにバインドするより良い方法があることを発見しました。代わりに「Item[]」にバインドします。これにより、項目が追加または削除されたとき (Count と同じ) だけでなく、項目が再配置または変更されたときにも PropertyChange が発生します。

ダンの例の更新版:

<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

于 2015-02-09T10:51:23.520 に答える