DataTemplate不生成ListItemBox

时间:2014-01-13 13:09:08

标签: c# wpf xaml datatemplate

我想使用DataTemplate生成ListItemBox,但项目没有生成。请指导我哪里出错。我在MainWindow.xaml中有以下代码。

<Window x:Class="Offline_Website_Downloader.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:bd="clr-namespace:Offline_Website_Downloader"
    Title="Offline Website Downloader" Background="#f5f6f7" Height="500" Width="800"
    WindowStartupLocation="CenterScreen">

<Window.Resources>

    <bd:BindingController x:Key="BindingControllerKey"  />

    <DataTemplate x:Key="DownloadedWebsitesListBox">

            <StackPanel Orientation="Vertical">
                <StackPanel Orientation="Horizontal" Width="Auto">

                    <TextBlock FontWeight="Bold" FontSize="18" Width="480">
                            <Hyperlink NavigateUri="http://google.com">
                                <Label Content="{Binding Path=WebsiteTitle}" />
                            </Hyperlink>
                    </TextBlock>

                    <TextBlock Width="132" TextAlignment="right">
                            <TextBlock Text="Remaining Time: "/>
                            <TextBlock Name="TimeRemaining" Text="js"/>
                </TextBlock>

                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <ProgressBar Name="progress1" Maximum="100" Minimum="0" Value="30" Background="#FFF" Width="612" Height="10" />
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                <TextBlock HorizontalAlignment="Left" Width="450">Status: <TextBlock Text="{Binding Path=Status}"/></TextBlock>
                    <TextBlock Width="162" TextAlignment="right">
                                    <TextBlock Text="Downloading Speed: "/>
                                    <TextBlock Name="DownloadingSpeed" Text="{Binding Path=DownloadingSpeed}"/>
                            </TextBlock>
                </StackPanel>
            </StackPanel>

    </DataTemplate>

</Window.Resources>

<Grid>
<ListBox Width="Auto" 
                 Name="WebsiteList"
                 Grid.Column="1" 
                 Grid.Row="2" 
                 Grid.RowSpan="2"
                 ItemsSource="{Binding}"
                 ItemTemplate="{StaticResource DownloadedWebsitesListBox}"
                 Margin="0,0,0,0">
</ListBox>
</Grid>
</window>

和MainWindow.xaml.cs

    BindingController bc = new BindingController();
    public MainWindow()
    {
        InitializeComponent();

           bc.DownloadingSpeed = "40kb/s";
            bc.WebsiteTitle = "WebsiteTitle";
            bc.Status = "Downloading";
            DataContext = bc;
}

和BindingController.cs

   public class BindingController
   {
    public BindingController()
    {

    }

    private string _WebsiteTitle;
    public string WebsiteTitle
    {
        set { _WebsiteTitle = value; }
        get { return _WebsiteTitle; }
    }

    private string _Status;
    public string Status
    {
        set { _Status = value ; }
        get { return _Status ; }
    }

    private string _DownloadStartDate;
    public string DownloadStartDate
    {
        set { _DownloadStartDate = value; }
        get { return _DownloadStartDate ; }
    }

    private string _DownloadingSpeed = "0 kb/s";
    public string DownloadingSpeed
    {
        set { _DownloadingSpeed = value; }
        get { return _DownloadingSpeed; }
    }

}

1 个答案:

答案 0 :(得分:3)

您的问题是您将ListBox绑定到包含多个属性的对象,但实际上只代表一个对象/状态。 ListBox期望显示项目列表(例如IListIBindingListIEnumerableObservableCollection)。

假设您希望一次显示多个下载,我假设您正在使用ListBox,我会将下载属性重构为单独的类。您还需要在属性上实现INotifyPropertyChanged,以便在更改值时,它们将显示在UI中。

public class Download : INotifyPropertyChanged
{
    private string _WebsiteTitle;
    public string WebsiteTitle
    {            
        get { return _WebsiteTitle; }
        set
        {
            if (_WebsiteTitle == value)
                return;

            _WebsiteTitle = value;
            this.OnPropertyChanged("WebsiteTitle");
        }
    }

    private string _Status;
    public string Status
    {
        get { return _Status; }
        set
        {
            if (_Status == value)
                return;

            _Status = value;
            this.OnPropertyChanged("Status");
        }
    }

    private string _DownloadStartDate;
    public string DownloadStartDate
    {
        get { return _DownloadStartDate; }
        set
        {
            if (_DownloadStartDate == value)
                return;

            _DownloadStartDate = value;
            this.OnPropertyChanged("DownloadStartDate");
        }
    }

    private string _DownloadingSpeed = "0 kb/s";
    public string DownloadingSpeed
    {
        get { return _DownloadingSpeed; }
        set
        {
            if (_DownloadingSpeed == value)
                return;

            _DownloadingSpeed = value;
            this.OnPropertyChanged("DownloadingSpeed");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if(this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

新的BindingController

public class BindingController
{
    public BindingController()
    {
        this.Downloads = new ObservableCollection<Download>();
    }

    public ObservableCollection<Download> Downloads { get; private set; }
}

在XAML中设置绑定:

<ListBox Width="Auto" 
         Name="WebsiteList"
         Grid.Column="1" 
         Grid.Row="2" 
         Grid.RowSpan="2"             
         ItemsSource="{Binding Downloads}"
         ItemTemplate="{StaticResource DownloadedWebsitesListBox}"
         Margin="0,0,0,0">
</ListBox>

MainWindow

中初始化集合
Download download = new Download();
download.DownloadingSpeed = "40kb/s";
download.WebsiteTitle = "WebsiteTitle";
download.Status = "Downloading";
bc.Downloads.Add(download);

this.DataContext = bc;