WPF ListView элементы привязки друг к другу - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть просмотр списка в WPF, который содержит наблюдаемую коллекцию объектов.Объекты представляют собой простые прямоугольные блоки, содержащие набор переключателей:

List Object example

Два набора переключателей можно разделить, установив «GroupName» вxaml в GroupName="Numbers" или GroupName="Letters"

- EDIT-- В соответствии с запросом, вот код в MyObject для радиокнопок:

<RadioButton Grid.Column="1" Grid.Row="1" GroupName="Numbers" IsChecked="{Binding IsOne, Mode=TwoWay}" />
<RadioButton Grid.Column="2" Grid.Row="1" GroupName="Numbers" IsChecked="{Binding IsOne, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />

<RadioButton Grid.Column="1" Grid.Row="2" GroupName="Letters" IsChecked="{Binding IsA, Mode=TwoWay}" />
<RadioButton Grid.Column="2" Grid.Row="2" GroupName="Letters" IsChecked="{Binding IsA, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />

Преобразователь отрицательных значений bool просто возвращает обратное значениезначения bool.

- End Edit -

Проблема возникает, когда у меня есть список двух из этих объектов в моем виде списка.Например, для первого объекта (объекта 1) выбраны «Один» и «А».Если я затем выберу «B» в объекте 2, выбор попытается измениться и для объекта 1 (что все испортило). Вот пример того, чего я надеюсь достичь:

Multiple list objects with different selections

Кто-нибудь видел такое поведение?На winforms это исправлено путем установки нового BindingContext для каждого элемента, но я не знаю, то же самое ли это в WPF.

Я работаю в полностью MVVM-среде, вот код для просмотра списка:

<ListView Name="ObjectsListView" ItemsSource="{Binding MyObjectList}" SelectedItem="{Binding SelectedObject, Mode=TwoWay}">
    <ListView.ItemTemplate>
         <DataTemplate>
              <ContentControl>
                   <local:MyObject DataContext="{Binding}"/>
               </ContentControl>
          </DataTemplate>
     </ListView.ItemTemplate>
</ListView>   

Может, кто-нибудь подскажет, как добиться отдельного поведения в элементах моего списка?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 ноября 2018

Проблема заключается в том, что каждый элемент списка создает радиокнопку с тем же именем группы, в wpf можно выбрать только одну радиокнопку из группы.Поэтому, если у вас есть два элемента или больше, радиокнопки будут принадлежать одной общей группе.

Решение: я добавляю два новых свойства в Model (ваш класс SelectObject)

private string _NameFirst;
public string NameFirst
{
    get { return _NameFirst; }
    set
    {
        if (value != _NameFirst)
        {
             _NameFirst = value;
             NotifyPropertyChanged();
        }
     }
 }

 private string _NameSecond;
 public string NameSecond
 {
     get { return _NameSecond; }
     set
     {
         if (value != _NameSecond)
         {
            _NameSecond = value;
            NotifyPropertyChanged();
          }
      }
}

Каждый элемент моделив списке должны быть разные NameFirst и NameSecond, есть несколько способов сделать это.Например, item1: (NameFirst = "A1", NameSecond = "B1"), item2: (NameFirst = "A2", NameSecond = "B2".

Также я изменяю ContentControl ListView, который я изменил только для StackPanelдля простоты вы можете остаться с сеткой.

<StackPanel>
    <RadioButton Grid.Column="0" Content="One" Grid.Row="0" GroupName="{Binding NameFirst}" IsChecked="{Binding IsOne, Mode=TwoWay}" />
    <RadioButton  Content="Two" GroupName="{Binding NameFirst}" IsChecked="{Binding IsOne, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />
    <RadioButton Content="A" GroupName="{Binding NameSecond}" IsChecked="{Binding IsA, Mode=TwoWay}" />
    <RadioButton  Content="B" GroupName="{Binding NameSecond}" IsChecked="{Binding IsA, Converter={StaticResource NegateBoolConverter}, Mode=TwoWay}" />
</StackPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...