WPF:绑定具有多个源的ListView

时间:2009-09-29 02:05:29

标签: c# wpf data-binding listview

致电所有WPF专家!

我正在将我创建的应用程序转换为从Window Forms到WPF创建特定RPG的字符。在大多数情况下,该程序的WPF格式更简单;但是,我似乎无法将这部分视为我的生活。

我有一个数据库,其中包含角色可以采取的技能列表。此数据库是从字符中独占的 - 更新字符不会更改数据库。用户可以根据需要向数据库添加新技能,但这与角色创建是分开的。在角色创建窗口中,我有一个ListView来显示数据库中列出的技能。单击ListView中的行更新描述文本框和图像控件 - 这一切都正常。

字符存储在字符类中;其中包含角色所采取的技能列表。此列表不包含数据库中的所有技能,因此用户可以在具有已修改数据库的应用程序之间交换该字符而不会出现问题。

我想显示字符类中的一些字段,以及同一ListView中数据库中的某些字段。例如,

名称(数据库),级别(字符),分数(字符),MaxTakenCount(数据库)

我想要实现的目标: 角色的技能列表将具有零技能,直到用户将“等级”值提高到大于1的值。更改“级别”将创建该技能的实例并将其存储在角色的技能列表中。使用存储在该技能的数据库中的公式计算得分(与Name,MaxTakenCount相同的表)。将“等级”设置为零会从角色的技能列表中删除技能。运气好的话,值是双向数据绑定,所以我可以使用undo / redo。 (每当进行更改时,撤消队列都会存储字符对象的序列化副本。)

这个WPF有多可能?我不知道如何处理数据库行和角色的技能列表来做我想做的事情。这是我到目前为止所拥有的。注意:分数和级别绑定不起作用,因为我不知道如何正确引用技能列表。技能列表是包含ListView的选项卡的数据上下文。 ListView的ItemSource在幕后设置为SkillTable。

 <ListView Name="listSkills" Margin="10" Grid.Row="2" IsSynchronizedWithCurrentItem="True" Background="#AAFFFFFF" FontSize="14">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name, Mode=TwoWay}" Margin="5" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Score">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Score, Mode=TwoWay}" Margin="5" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Level">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ListBox SelectedIndex="{Binding Level, Mode=TwoWay}">
                            <ListBox.Style>
                                <Style TargetType="ListBox">
                                    <Setter Property="ItemsPanel">
                                        <Setter.Value>
                                            <ItemsPanelTemplate>
                                                <StackPanel Orientation="Horizontal" Margin="5,0" HorizontalAlignment="Left" />
                                            </ItemsPanelTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </ListBox.Style>
                            <ListBoxItem Width="15"> </ListBoxItem>
                            <ListBoxItem Width="15">S</ListBoxItem>
                            <ListBoxItem Width="15">T</ListBoxItem>
                            <ListBoxItem Width="15">M</ListBoxItem>
                        </ListBox>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

ListView将填充数据库中的每一行。数据库列已正确填充;但是,字符字段不是。请帮助这个WPF新手!!

1 个答案:

答案 0 :(得分:1)

尝试从不同的角度来看待这个问题。 ListView.ItemsSource属性可以绑定到一个集合项。因此,首先创建一个类,该类封装您要在ListView中显示的所有值。然后创建一个ObservableCollection<YourClass>并填充数据库中可以包含的任何值,其他值可以在代码中填充,或者稍后从UI填充。然后将此集合绑定到您的ListView.ItemsSource属性,它将全部按您的意愿工作。

哦......刚注意到发布日期。好吧,我希望这有助于其他人。