Список с флажком, не вызывающим выбранный элемент, когда флажок установлен / снят - PullRequest
1 голос
/ 19 января 2011

Мое приложение разработано с использованием шаблона wpf MVVM, в котором у меня есть список, в котором показан набор операций, которые нужно выбрать с помощью флажка, чтобы установить или снять флажок.Мне нужно получить выбранный элемент всякий раз, когда флажок установлен / снят.Я связываю свойство IsChecked флажка со свойством в моей модели, а свойство selecteditem списка со свойством в моей модели представления.Всякий раз, когда я проверяю / снимаю отметку с первого элемента в списке, событие выбранного элемента запускается, однако, то же самое не срабатывает, когда я отмечаю / снимаю флажок с любого элемента, кроме первого выбранного элемента в списке.Мне нужно фиксировать изменения всякий раз, когда пользователь вносит какие-либо изменения в элементы списка.Вот мой взгляд:

<ListBox Height="280" Width="Auto" ItemsSource="{Binding OperationsInfoCol}" SelectionMode="Multiple"
                        SelectedItem="{Binding Path=SelectedOperationItem,UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding CanEnableListBox}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox  Content="{Binding OperationName}"
                                              IsChecked="{Binding Path=IsOperationSelected,Mode=TwoWay}" IsEnabled="{Binding Path=CanEnableOperation,Mode=TwoWay}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="IsSelected" Value="{Binding IsOperationSelected,Mode=TwoWay}"/>
            <Setter Property="IsEnabled" Value="{Binding CanEnableOperation,Mode=TwoWay}"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
            </Style.Triggers>

        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Модель представления:

   public OperationsInfo SelectedOperationItem
    {
        get
        {
            return m_oOperationSelected;
        }
        set
        {
            if (value != null)
            {
                m_oOperationSelected = value;
                OnPropertyChanged("SelectedOperationItem");
                if (null != m_oOperationSelected)
                {
                    ObservableCollection<OperationsInfo> oCol = new ObservableCollection<OperationsInfo>();
                    //if (m_oOperationSelected.CanEnableOperation)
                    {
                        foreach (OperationsInfo itm in OperationsInfoCol)
                        {
                            if (itm.OperationId == m_oOperationSelected.OperationId && m_oOperationSelected.CanEnableOperation)
                            {
                                itm.IsOperationSelected = !m_oOperationSelected.IsOperationSelected;
                            }
                            oCol.Add(itm);
                        }

                        OperationsInfoCol.Clear();
                        OperationsInfoCol = oCol;
                    }
                }
            }
        }
    }

Модель:

public class OperationsInfo    { 

    private string m_strOperationName;
    private int m_nOperationId;
    private bool m_bIsOperationSelected;
    private bool m_bCanEnable;
    private LicenseManagerViewModel m_VMLicenseManager; 


public bool IsOperationSelected
    {
        get
        {
            return m_bIsOperationSelected;
        }
        set
        {                
            m_bIsOperationSelected = value;                
            LicenseManagerVM.OperationInfoChecked = value;                
        }
    }

}

Ответы [ 2 ]

1 голос
/ 24 января 2011

Поскольку вы установили SelectionMode = "Multiple", вы не можете использовать SelectedItem.
Вы также не можете привязать к SelectedItems, потому что это свойство доступно только для чтения.

Не все потерянопотому что в вашем коде вы привязываете IsSelected к IsOperationSelected

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="IsSelected" 
                Value="{Binding IsOperationSelected,Mode=TwoWay}"/>
    </Style>
</ListBox.ItemContainerStyle>

Так что теперь вы можете обрабатывать выбранные элементы, используя IsOperationSelected, как указано в следующем примере в вашей ViewModel:

foreach (var operationsInfo in OperationsInfoCol)
{
  if ( operationsInfo.IsOperationSelected)
  {
    // do something...
  }
}
0 голосов
/ 19 января 2011
  1. Вы, вероятно, должны связать IsChecked со свойством IsSelected контейнера ListBoxItem
  2. Таким образом, вы можете обработать событие SelectionChanged ListBox и реагировать на любыеизменения.(используйте e.AddedItems и e.RemovedItems, чтобы узнать, какие изменения были сделаны.)

Пример кода:

     <ListBox ItemsSource="{Binding Data}" SelectionChanged="ListBox_SelectionChanged" SelectionMode="Extended">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Name}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"/>            
            </DataTemplate>         
        </ListBox.ItemTemplate>
    </ListBox>

Позади:

    private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        ListBox lb = sender as ListBox;
        if (e.AddedItems.Count > 0)
        {
            foreach (Employee emp in e.AddedItems.Cast<Employee>()) MessageBox.Show("Added: " + emp.Name);
        }
        if (e.RemovedItems.Count > 0)
        {
            foreach (Employee emp in e.RemovedItems.Cast<Employee>()) MessageBox.Show("Removed: " + emp.Name);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...