をするのに役立ちます。作成することができ、<ItemTemplate>
には、アイテムの「通常の」表現とプログレスバーの両方が含まれています。最初に進捗バーのVisibility
をCollapsed
に設定します。ダウンロードが開始されると、Visibility
はVisible
に変更されます(アイテムの他の部分も折りたたむことができます)。
Visibility
プロパティは、アイテムのビューモデルのプロパティにデータバインドできます。 IsDownloading
のようなブール値プロパティを使用し、true
をVisible
に、false
をCollapsed
に変換するコンバータを使用してバインドできます。
プログレスバーを表示するには、IsDownloading
をtrueに設定し、PropertyChanged
イベントを発生させるだけです。ダウンロードが完了したら、IsDownloading
をfalseに設定し、PropertyChanged
イベントを再度発生させます。
これはどのように行うことができるかについての概略図です。あなたがにデータバインドすることができるListView
であなたの項目のビューモデルクラスが必要になります。
class Item : INotifyPropertyChanged {
public String Name { ... }
public Double Progress { ... }
public Boolean IsDownloading { ... }
...
}
あなたはまたBoolean
Visibility
に変換することができ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>
いいですが、どうすればプログレスバーにバインドしてVMからアップデートできますか? – ibm123
@ ibm123 Martinさんの例では、ItemクラスにプログレスバーにバインドされているProgressプロパティがあります。これはあなたが望むものです。しかし、BackgroundWorkerで実際のダウンロードを行い、ReportProgressメソッドを使用することができます。また、ディスパッチャーのDispatcher、Invoke/BeginInvoke、およびCheckAccessメソッドで実行できるスレッドセーフ版のINotifyPropertyChangedを実装すると便利です。 – dowhilefor
よかった、ありがとう! – ibm123