2017-06-19 20 views
0

ListViewでスイッチをオンにすると、他のスイッチがオフになる機能を実装しようとしています。私はMVVMバインディングを使用して、イベントのデータを変更しようとしている '( "のisActive")をOnPropertyChangedを' は実装することができませんリストビュー内でスイッチを一度に1つだけオンにする

<ListView ItemsSource="{Binding AllProfiles}" HasUnevenRows="True" SeparatorVisibility="None" RowHeight="-1"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <StackLayout Orientation="Vertical" BackgroundColor="#F6F6F6"> 
        <Frame Padding="2" BackgroundColor="#FFFFFF" Margin="10,5,10,5"> 
         <StackLayout Orientation="Horizontal" BackgroundColor="#FFFFFF" Padding="20"> 
          <StackLayout Orientation="Vertical"> 
           <Label Text="{Binding Name}" TextColor="#FF6D9D" FontSize="25"></Label> 
           <Label Text="{Binding Email}" TextColor="#B1B1B1" FontSize="18"></Label> 
          </StackLayout> 
          <Switch HorizontalOptions="EndAndExpand" VerticalOptions="CenterAndExpand" IsToggled="{Binding IsActive}"> 
          </Switch> 
         </StackLayout> 
        </Frame> 
       </StackLayout> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

以下は、私のXAMLです。

提案が参考になります。

編集:

public class SetProfileViewModel:ViewModelBase 
{   
    private ObservableCollection<Profile> _allProfiles = new ObservableCollection<Profile>(); 

    public ObservableCollection<Profile> AllProfiles 
    { 
     get { return _allProfiles; } 
     set 
     { 
      _allProfiles = value; 
      OnPropertyChanged("AllProfiles"); 
     } 
    } 
} 

public class Profile:ViewModelBase 
{ 
    private string _name; 
    private string _email; 
    private bool _isActive; 
    public string Name { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 
    public string Email 
    { 
     get { return _email; } 
     set 
     { 
      _email = value; 
      OnPropertyChanged("Email"); 
     } 
    } 
    public bool IsActive 
    { 
     get { return _isActive; } 
     set 
     { 

      _isActive = value;     
      OnPropertyChanged("IsActive"); 
      //How can I change 'AllProfiles' data from here. 
     } 
    } 
} 
+1

データバインディングを使用している場合、 'AllProfiles'コレクションのアイテムを反復してプロパティをfalseに設定するだけです。 –

+0

@GeraldVersluis ..応答に感謝します。私は変更を加えました。編集を参照してください。私はプロファイルクラスの下で 'IsActive'の 'AllProfiles'のアイテムデータを変更しようとしています。どうやってやるの? –

答えて

1

ProfileItemでプロパティのセッターからAllProfilesにアクセスするには、あなたは懸念の分離という点では良い考えではないのViewModelにProfileItemからの参照を追加する必要があります。私の提案は、ViewModelにアクティブなプロファイルの変更を処理させることです。

これを行うには、それぞれの項目のPropertyChangedにViewModelをサブスクライブし、それに応じてIsActiveの変更を処理する必要があります。最初は各アイテムを購読する必要があり、ProfileItemが削除された場合には購読を解除し、VMの初期化後に追加される新しいアイテムを購読する必要があるため、これは苦しいことです。

しかし、このような定型的なものは私の経験からMVVMによく見られます。

+0

ありがとう@Marc ..あなたのソリューションはうまくいった。しかし、私はここにある障害物に直面しています。 「ItemChanged」関数内でプロパティ値を変更するたびに、変更された値の数に応じて繰り返し呼び出されます。私は変更して登録する前にリリースしようとしましたが、同じ結果です。回避策を提案してください。 –

+0

@AkshatAgarwal私は通常、この種のループを、処理を有効/無効にするフラグ変数で回避します。私は私の答えのコードを更新しました。お役に立てれば。 – Marc

関連する問題