0

バインドされたデータのみを変更したい場合に、ListView の選択変更イベントが発生しないようにするにはどうすればよいですか?

明確にするために、次のようなクラスがあります。

public class MyCollectionViewModel : BindableBase
{
    public ObservableCollection<MyItemViewModel> MyItems { get; set; }

    private MyItemViewModel _selectedItem;
    public MyItemViewModel SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            this.SetProperty(ref _selectedItem, value);

            if (_selectedItem != null)
            {
                // Do something...
            }
        }
    }
    ...
}

public class MyItemViewModel : BindableBase
{
        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set { this.SetProperty(ref _isSelected, value); }
        }
        ...
}

次のデータ テンプレートを使用します。

<DataTemplate x:Key="MyItemTemplate">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <CheckBox Margin="10" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" />
        <Border Grid.Column="1">
            ...
        </Border>
    </Grid>
</DataTemplate>

...そして次のように使用されます:

<ListView ItemsSource="{Binding Source={StaticResource SessionsViewSource}}"
          ItemTemplate="{StaticResource MyItemTemplate}"
          SelectedItem="{Binding Sessions.SelectedItem, Mode=TwoWay}"
          IsSwipeEnabled="False" />

ListView をある程度視覚化するには:

   +---------------------
   + [x]  myItem1
   +---------------------
   + [ ]  myItem2
   +---------------------

ユーザーは、チェックボックスをオンまたはオフにすることができます。問題は、既存の選択がある場合、IsSelectedバインディングが更新されると、選択バインディングも発生することです。

これを修正する簡単な方法はありますか?できるだけMVVMにこだわりたいです。

4

2 に答える 2

0

あなたの財産を

public MyItemViewModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (value.IsSelected)
        {
            this.SetProperty(ref _selectedItem, value);
        }
        // Optional: if you require
        else
        {
            this.SetProperty(ref _selectedItem, null);
        }            
    }
}
于 2013-10-31T07:50:03.947 に答える
0

SelectedItem="{Binding Sessions.SelectedItem}"チェックボックスバインディングから適切な選択を受け取る必要はありませんを削除するだけです。また、ListView SelectionMode を None に変更する必要があります。あなたのプロパティは IsSelected と呼ばれているため、紛らわしいです。IsChecked という名前を付けて、それに注目し、選択機能を削除します。ListView を介して ItemsControl にダウングレードすることもできます。

于 2013-11-03T19:59:45.437 に答える