WPF - привязка к коллекции в объекте - PullRequest
1 голос
/ 26 мая 2011

Я пытался заставить его работать в течение нескольких дней. Что не так в этом коде?

Это мое окно 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 ]

2 голосов
/ 26 мая 2011

Да, это должно быть 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>

Удачи.Michael

1 голос
/ 26 мая 2011

Во-первых, вы должны использовать ObservableCollection<DownloadLink> вместо List<DownloadLink>, если вы планируете вносить изменения в список после настройки привязки.

Во-вторых, просто для ясности:

MainListBox.ItemsSource = RapideoAccount.Links;

не является обязательным.Вы просто устанавливаете собственность.Это будет работать для определенных сценариев, но на самом деле не является обязательным, как мы обычно говорим в WPF.

1 голос
/ 26 мая 2011

Я думаю, что ссылки должны быть ObservableCollection, а не списком.

...