2017-02-27 8 views
0

EDIT:DataTemplateが呼び出されても再度実行されないため、問題があるようです。 2回目の呼び出し時にDataTemplateを強制的に実行するにはどうすればよいですか?MVVM DataTemplateのセルをデータの集まりで変更する

私は、各行がチェックボックスとラベルであるリストビューを持っています。ユーザーがラベルまたはチェックボックスを選択すると、チェックボックスがアクティブになり、アイテムがselectedListに追加されます。このリストビューの外に、このリストからアイテムを追加/削除する他の方法があります。

リストビューがアクティブになって表示されたら、selectedListの現在のアイテムにチェックマークが付いているようにします。私はselectedListとすべてのアイテムとの間の比較を実行することでこれを行うことができます。両方に存在する場合はチェックします。

ここに問題があります。ラベルのテキストはバインド可能なプロパティなので、データテンプレートの初期化時には使用できません(したがって、値がselectedItemのリストにあるかどうかは確認できません)。以下のコードはlistviewが初めて表示されたときに動作します(私もChildAddedを試しました、うまくいきませんでした)。

cell.Appearing += (s, e) => 
       { 
        foreach (FloorDetailsViewModel floor in _viewModel.SelectedFloorsList) 
        { 
         if (floor.Name == label.Text) 
          checkBox.Source = activeImage; 
        } 
       }; 

enter image description here

手動でそれを呼び出すことによってするDataTemplateを再実行することができない時はいつでも

答えて

0

常にその比較コードを実行する方法はあります。 DataTemplateのItemSourceをnullに設定してから、新しい値に戻す必要があります。これにより、DataTemplate全体が更新されます。なぜこのようにしなければならないのか分かりませんが、それはあなたのやり方です。

0

あなたは間違っていると思います。 MVVM外で何もする必要がないようにBindable CheckBoxを用意する必要があります(モデルの値によってはチェックボックスが自動的にチェックされるかチェックされません)

+0

Bindable CheckBoxはどのようにVM側で動作しますか?変数である各フロア項目のチェックボックスが必要です。唯一の方法は、私のFloorクラスに「選択された」プロパティを追加することです。これはちょっとした解決策です。リストビューを適切に表示するために、クラスにプロパティを含めることは望ましくありません。 明確にするために、リストビューのItemSourceはFloorオブジェクトのリストです。ラベルはフロアの名前に設定されていますが、コースの名前はクラスの一部であることが必要です。 1つのリストビューの「選択された」プロパティーは表示されません。 –

+0

チェックボックスがViewCell(「名前」など)にある場合、それはFloorオブジェクト内にあるはずです。これは私の意見です –

+0

それは動作するが、私はそれが良い解決策ではないと思う。 DataTemplatesのItemSourceをnullに設定して正しい値に戻すことで、それを実行できました。これにより、セルのOnAppearリスナーが正しく呼び出されました。また良い解決策ではありませんが、良いことはないかもしれません。 –

関連する問題