2016-07-26 8 views
-1

Schranken-ObjectsのリストであるElementsへのitemsourceを持つListViewがあります。 SchrankePresenterは、ページのDataContext(コンストラクタで設定)です。OnPropertyChangedはビューを更新しません

ボタンがクリックされるまでページが正しく表示されます。ボタンをクリックすると、ボタンの名前の値が変更され、ListViewに1つの項目が追加されますが、何も起こらない/更新されます。

public class SchrankePresenter : INotifyPropertyChanged 
    { 
     private List<Schranke> _elements; 
     public List<Schranke> Elements 
     { 
      get { return _elements; } 
      set 
      { 
       _elements = value; 
       OnPropertyChanged("Elements"); 
      } 
     } 
     public ICommand ClickCommand { get; set; } 
    private void OnPropertyChanged(string propName) 
    { 
     Debug.WriteLine($"on Property changed with {propName}"); 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public SchrankePresenter() 
    { 
     var elements = new List<Schranke>(); 
     for (var i = 1; i < 15; i++) 
      elements.Add(new Schranke() { Name = $"{i}: Schranke" }); 

     Elements = elements; 
     Debug.WriteLine("ctor"); 
     ClickCommand = new DelegateCommand<Schranke>(ClickAction); 
    } 

    public void ClickAction(Schranke item) 
    { 
     VibrationDevice.GetDefault().Vibrate(TimeSpan.FromMilliseconds(150)); 

     Debug.WriteLine($"{item?.Name} was clicked"); 
     item.Name = "was clicked"; 
     OnPropertyChanged("Name"); 
     Elements.Add(new Schranke() { Name = "addednew element" }); 
     OnPropertyChanged("Elements"); 

    } 

} 

Schrankeが唯一のメンバー持つクラス:

<ListView ItemsSource="{Binding Elements, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="lv_schranken" Grid.Row="1" SelectedItem="{Binding SelectedItem}"> 

      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Button Height="80" 
          HorizontalAlignment="Stretch" 
          Command="{Binding ElementName=lv_schranken, Path=DataContext.ClickCommand}" 
          CommandParameter="{Binding}" 
          Style="{StaticResource TransparentStyle}"> 
         <Grid> 
           . 
           . (some grid stuff) 
           . 

          <TextBlock Name="schranken_name" 
             Grid.Row="1" 
             Grid.Column="1" 
             HorizontalAlignment="Center" 
             VerticalAlignment="Center" 
             FontWeight="ExtraLight" 
             FontSize="25" 
             Foreground="Black" 
             Text="{Binding Name, Mode=TwoWay}" /> 
         </Grid> 
        </Button> 
       </DataTemplate> 

      </ListView.ItemTemplate> 

     </ListView> 

PS:public string Name { get; set; }

ビューがどのように見える。ここ

はSchrankenPresenterあるいくつかの必要がある場合DelegateCommand - 実装:

public class DelegateCommand<T> : ICommand 
    { 
    private Action<T> _clickAction; 

    public DelegateCommand(Action<T> clickAction) 
    { 
     _clickAction = clickAction; 
    } 

    public event EventHandler CanExecuteChanged; 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public void Execute(object parameter) 
    { 
     _clickAction((T)parameter); 
    } 
} 
+1

'OnPropertyChangedを(「名前」)にinotifypropertychangedを実装;'名 'で、' Schranke'クラスで呼び出されなければなりません'セッター。 – ASh

+0

リサーチを行ったことがあれば、リストにバインドされていないことがわかります。 –

+0

バインド目的でリストを使用することはできませんか? – student96

答えて

1

アイテムのリストに結合するあなたの場合は、あなたがObservableCollectionにバインドする必要があります

が 項目が追加、削除、またはリスト全体が更新されたとき取得したときに通知を提供して動的なデータコレクションを表し。

https://msdn.microsoft.com/de-de/library/ms668604(v=vs.110).aspx

0

ViewmodelからUIを更新するために、我々はinotifypropertychangedを提起するために必要です。 observablecollectionはデフォルトでinotifypropertychangedの実装を提供します。 MVVm patternについてはobservablecollectionを参照できます。

あなたが同じのためのリストを使用したい場合は、あなたがする必要があることを特定のリスト

関連する問題