2017-09-18 7 views
1

私はWPFでC#でプロジェクトを進めています。私はListViewを持っています。これは、オブジェクトへのバインドによって生成されます。これは、_nameがのフィールドです。どの_nameを更新するかを知って特定のProgressBarを更新できるようにしたい。したがって、現在の_nameが「タスクA」の場合、「タスクA」と同じ行のProgressBarを更新したいとします。しかし、進捗バーに名前を付けることができないため(名前にデータをバインドしようとするとエラーメッセージが表示される)、コードからProgressBarにアクセスする方法を見つけることができませんでした。私はタグを使用しようとしましたが、特定のタグを持つコントロールにアクセスする方法を理解できませんでした。どんな助けでも大歓迎です。以下は、私のプロジェクトのXAMLの一部です。C#のListViewでProgressBarにアクセスする方法名前なしのWPF

<ListView.View> 
      <GridView> 
       <GridViewColumn Width="30"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox Tag="{Binding _name}" IsChecked="True"/> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <GridViewColumn Width="200" DisplayMemberBinding="{Binding _name}">Task Name</GridViewColumn> 
       <GridViewColumn Width="150"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <ProgressBar Width="145" Height="15" Maximum="100" Value="{Binding _progress}" Tag="{Binding _name}"/> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 

答えて

0

要素ProgessBarにはアクセスしません。代わりに、Valueプロパティを更新するソースオブジェクトのプロパティにバインドします。

_progress_nameは(あなたが道でこれらの名前を変更する必要があり)、あなたはListViewためItemsSourceとして使用IEnumerable<T>のすなわちタイプTプロパティデータ型のパブリックでなければなりません。

このクラスは、INotifyPropertyChangedを実装する必要があります。

public class DataObject : INotifyPropertyChanged 
{ 
    private double _progress; 
    public double Progress 
    { 
     get { return _progress; } 
     set { _progress = value; NotifyPropertyChanged("Progress"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

<DataTemplate> 
    <ProgressBar Width="145" Height="15" Maximum="100" Value="{Binding Progress}" Tag="{Binding _name}"/> 
</DataTemplate> 

あなたは、単にListView、.egのItemsSourceコレクション内の特定の項目のProgressプロパティを変更:

var col = listView.ItemsSource as List<DataObject>; 
var item = col.FirstOrDefault(x => x.Name == "some name..."); 
if(item != null) 
    item.Value = 100.0; 
+0

私はあなたが言ったことに従って、私のデータオブジェクトクラスはINotifyPropertyChangedを実装して、表示されたイベントと関数を追加しましたが、プログレスバーは視覚的に更新されません。進行状況を更新するときに印刷をデバッグすると正しい番号が出力されるので、フィールドは正しく更新されます。 –

+0

本当にXAMLの*プロパティ*にバインドしましたが、バッキングフィールドにバインドしていませんか? – mm8

+0

_progressではなくProgressを使用するようにプロパティを更新するコードを更新するのを忘れました。ありがとうございました! –

関連する問題