listboxitem中的进度条

时间:2012-01-23 08:58:03

标签: c# wpf multithreading

我有一个带有项目的列表框,我使用datatemplate来显示项目

我想制作一个下载按钮,一旦用户选择了一个项目,然后点击按钮就会将一个进度条添加到所选的项目数据模板并显示下载进度,是否可以?

任何指针都会有所帮助

 <ListBox Name="List" Grid.Row="2" 
                 ScrollViewer.HorizontalScrollBarVisibility="Visible" 
                 ScrollViewer.VerticalScrollBarVisibility="Disabled"  
                 ItemTemplate="{StaticResource ListTemplate}" 
                 ItemsSource="{Binding Path=Items}" 
                 SelectedItem="{Binding Path=SelectedItem}"
                 ItemContainerStyle="{StaticResource RoundedItem}" 
                 BorderBrush="{x:Null}" BorderThickness="0" 
                 Background="{x:Null}">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Margin="10" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>

感谢

1 个答案:

答案 0 :(得分:0)

是的,有可能。您可以创建并<ItemTemplate>包含项目的“正常”表示以及进度条。最初,您将进度条的Visibility设置为Collapsed。下载开始后,您将Visibility更改为Visible(您可能还想要折叠该项目的其他部分)。

您可以将Visibility属性数据绑定到项目视图模型的属性。您可以使用类似IsDownloading的布尔属性,然后通过将true转换为Visiblefalse转换为Collapsed的转换器进行绑定。

要显示进度条,只需将IsDownloading设置为true即可触发PropertyChanged事件。下载完成后,您将IsDownloading设置为false并再次触发PropertyChanged事件。

这是一个关于如何做到这一点的草图。您需要ListView中的项目的视图模型类,您可以将其编辑为:

class Item : INotifyPropertyChanged {

  public String Name { ... }

  public Double Progress { ... }

  public Boolean IsDownloading { ... }

  ...

}

您还需要一个可以IValueConverter转换为Boolean的{​​{1}}:

Visibility

您的观点应基于以下内容:

class VisibilityConverter : IValueConverter {

  public Boolean Invert { get; set; }

  Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) {
    var visible = Convert.ToBoolean(value) ^ Invert;
    return visible ? Visibility.Visible : Visibility.Collapsed;
  }

  Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) {
    throw NotImplementedException();
  }

}