WPF - 绑定到对象中的集合

时间:2011-05-25 22:00:59

标签: c# .net wpf data-binding collections

我试图让它工作几天。 这段代码有什么问题?

这是我的窗口XAML:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Rapideo_Client"
        x:Class="Rapideo_Client.MainWindow"     
        Title="NVM" SnapsToDevicePixels="True" Height="400" Width="625">
    <Window.Resources>
        <DataTemplate x:Key="linksTemplate" DataType="DownloadLink">
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding Path=Name}" FontWeight="Bold"></TextBlock>
                <Label Content="{Binding Path=SizeInMB}"/>
                <Label Content="{Binding Path=Url}"/>
            </StackPanel>
        </DataTemplate>
    </Window.Resources> 
        <ListView   ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                    ScrollViewer.VerticalScrollBarVisibility="Visible"
                    x:Name="MainListBox"
                    ItemTemplate="{DynamicResource linksTemplate}">                
        </ListView>
</Window>

这是我的班级:

class Rapideo
    {
        (...)
        public List<DownloadLink> Links { get; private set; }
        (...)
    }

这是我的项目:

class DownloadLink
{
    public string Name { get; private set; }
    public string Url { get; private set; }
    public DateTime ExpiryDate { get; private set; }
    public float SizeInMB { get; private set; }
    public int Path { get; private set; }
    public string Value { get; private set; }
    public LinkState State { get; set; }
    public enum LinkState
    {
        Ready, Downloading, Prepering, Downloaded
    }

    public DownloadLink(string name, string url, DateTime expiryDate, float sizeInMB, int path, string value, LinkState state)
    {
        Name = name;
        Url = url;
        ExpiryDate = expiryDate;
        SizeInMB = sizeInMB;
        Path = path;
        Value = value;
        State = state;
    }
}

这是我的约束力:

RapideoAccount = new Rapideo();
MainListBox.ItemsSource = RapideoAccount.Links;

稍后在代码中我在RapideoAccount.Links中填充该列表。 但是ListView中没有显示任何内容。 列表视图始终为空。

该代码中的错误在哪里?

3 个答案:

答案 0 :(得分:2)

是的,如果您计划在设置ObservableCollection<DownloadLink>之后添加它,那么它应该是ItemsSource。如果列表已预加载且您不会更改它,则List<T>将起作用。

现在我认为

MainListBox.ItemsSource = RapideoAccount.Links;

在技术上仍然是一种约束力。但你可能想到的是通过DataContext而不是直接绑定(也就是MVVM风格)。所以那就是:

RapideoAccount = new Rapideo();
this.DataContext = RapideoAccount;

然后在你的窗口中,你将像这样绑定你的ItemSource:

<Window
    ...
    <ListView  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
               ScrollViewer.VerticalScrollBarVisibility="Visible"
               x:Name="MainListBox"
               ItemsSource="{Binding Links}" 
               ItemTemplate="{DynamicResource linksTemplate}">                
    </ListView>
</Window>
祝你好运。 迈克尔

答案 1 :(得分:1)

我认为链接需要是ObservableCollection,而不是列表。

答案 2 :(得分:1)

首先,如果您计划在设置绑定后对列表进行更改,则应使用ObservableCollection<DownloadLink>而不是List<DownloadLink>

其次,要明确:

MainListBox.ItemsSource = RapideoAccount.Links;

不是绑定。你只是设置了财产。这适用于某些场景,但它并不像我们通常在WPF中谈论的那样具有约束力。