2012-01-23 14 views
0

に私はアイテムをリストボックスを持って、私はダウンロードボタンを作りたいアイテムプログレスバーがlistboxitem

を表示するためにする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> 

おかげ

答えて

0

をするのに役立ちます。作成することができ、<ItemTemplate>には、アイテムの「通常の」表現とプログレスバーの両方が含まれています。最初に進捗バーのVisibilityCollapsedに設定します。ダウンロードが開始されると、VisibilityVisibleに変更されます(アイテムの他の部分も折りたたむことができます)。

Visibilityプロパティは、アイテムのビューモデルのプロパティにデータバインドできます。 IsDownloadingのようなブール値プロパティを使用し、trueVisibleに、falseCollapsedに変換するコンバータを使用してバインドできます。

プログレスバーを表示するには、IsDownloadingをtrueに設定し、PropertyChangedイベントを発生させるだけです。ダウンロードが完了したら、IsDownloadingをfalseに設定し、PropertyChangedイベントを再度発生させます。

これはどのように行うことができるかについての概略図です。あなたがにデータバインドすることができるListViewであなたの項目のビューモデルクラスが必要になります。

class Item : INotifyPropertyChanged { 

    public String Name { ... } 

    public Double Progress { ... } 

    public Boolean IsDownloading { ... } 

    ... 

} 

あなたはまたBooleanVisibilityに変換することができIValueConverter必要があります。

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(); 
    } 

} 

あなたのビューが基づいている必要がありますが

<ListBox 
    <ListBox.Resources> 
    <local:VisibilityConverter x:Key="VisibilityConverter"/> 
    <local:VisibilityConverter x:Key="InverseVisibilityConverter" Invert="True"/> 
    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
     <TextBlock 
      Text="{Binding Name}" 
      Visibility="{Binding IsDownloading, Converter={StaticResource InverseVisibilityConverter}}"/> 
     <ProgressBar 
      Value="{Binding Progress}" 
      Visibility="{Binding IsDownloading, Converter={StaticResource VisbilityConverter}}"/> 
     </Grid> 
    <DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

いいですが、どうすればプログレスバーにバインドしてVMからアップデートできますか? – ibm123

+0

@ ibm123 Martinさんの例では、ItemクラスにプログレスバーにバインドされているProgressプロパティがあります。これはあなたが望むものです。しかし、BackgroundWorkerで実際のダウンロードを行い、ReportProgressメソッドを使用することができます。また、ディスパッチャーのDispatcher、Invoke/BeginInvoke、およびCheckAccessメソッドで実行できるスレッドセーフ版のINotifyPropertyChangedを実装すると便利です。 – dowhilefor

+0

よかった、ありがとう! – ibm123

関連する問題