1

我目前使用嵌套在列表视图中的列表视图来以图形方式显示淘汰赛风格的锦标赛,由 SectionTreeOne 在 ViewModel 中备份,其中包含对象“TournamentNode”的列表列表。但是,当我单击它时,我无法绑定我选择的“锦标赛节点”。

  <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}"

请记住,WinRT 始终使用OneWay默认绑定模式,这与 WPF 不同,它会根据属性性质或可访问性自动选择绑定模式。

我在 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 回答