1

私は現在、オブジェクト「TournamentNode」のリストのリストを含む SectionTreeOne によって ViewModel にバックアップされたノックアウト スタイルのトーナメントをグラフィカルに表示する方法として、リストビュー内にネストされたリストビューを使用しています。ただし、選択した「トーナメント ノード」をクリックしてもバインドできません。

  <Grid Grid.Row="2">
          <ListView ItemsSource="{Binding SectionTreeOne}">
                                <ListView.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <VirtualizingStackPanel Orientation="Horizontal" />
                                    </ItemsPanelTemplate>
                                </ListView.ItemsPanel>
                                <ListView.ItemTemplate >
                                    <DataTemplate>
                                        <ListView ItemsSource="{Binding}" SelectionMode="Single" 
                                                  SelectedItem="{Binding SelectedTournamentNode}">
                                            <ListView.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Name}" />
                                                </DataTemplate>
                                            </ListView.ItemTemplate>
                                        </ListView>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                        </Grid>

C# バインディング:

コレクション

public List<List<TournamentNodeModel>> SectionTreeOne
            {
                get { return _sectionTreeOne; }
                set
                {
                    _sectionTreeOne = value;
                    base.OnPropertyChanged("SectionTreeOne");
                }
            }

選択したアイテム:

public TournamentNodeModel SelectedTournamentNode
        {
            get { return _selectedTournamentNode; }
            set
            {
                if (value == _selectedTournamentNode)
                    return;

                _selectedTournamentNode = value;
                base.OnPropertyChanged("SelectedTournamentNode");
            }
        }
4

1 に答える 1

3

次のバインディングを試してください。

SelectedItem="{Binding SelectedTournamentNode, Mode=TwoWay}"

OneWayプロパティの性質やアクセシビリティに応じてバインド モードが自動的に選択される WPF とは異なり、WinRT は常にバインド モードを既定として使用することに注意してください。

この種の間違いを避けるために WinRT で使用した良い原則は、バインド モードを常に明示的に指定することです。


それで、私は最終的にあなたのバインディングの間違いを見つけました. まず、前述のようSelectedItemにバインド モードをTwoWay明示的に設定する必要があります。

次に、ネストされたリストはリスト内の内部リストにSectionTreeOneバインドされていたため、ビュー モデルのプロパティにバインドする場合は、名前付き要素を使用してSelectedItem、このプロパティを親リストの に再バインドする必要があります。DataContextプロパティが配置されているビューモデルにバインドするのではなく、実際には内部リストの存在しないプロパティにバインドしようとしていました。

<ListView x:Name="listView" ItemsSource="{Binding SectionTreeOne}">
    ...
    <ListView.ItemTemplate >
        <DataTemplate>
            <ListView ItemsSource="{Binding}" SelectionMode="Single" 
                      SelectedItem="{Binding Path=DataContext.SelectedTournamentNode, ElementName=listView, Mode=TwoWay}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}" />
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Visual Studio デバッガーの出力を読んでください。バインディング チェーンで発生する可能性のあるバインディング エラーに関する非常に役立つ情報が記載されています。特に、別のリストにネストされたリストをバインドする場合は、頭痛の種が大幅に軽減されます。

于 2013-03-22T10:40:12.200 に答える