Строка данных IsSelected привязки - PullRequest
2 голосов
/ 31 августа 2010

Я хочу связать логическое поле в моей ViewModel, чтобы оно было установлено в true, когда выбрана строка в сетке данных.

Так что у меня есть эта работа с трюком стиля.Это используется в моей теме:

Затем в разметке XAML для Datagrid: ItemContainerStyle = "{DynamicResource ItemSelection}"

Но мне это кажется очень плохой формой,Я не ожидаю, что привязка свойств будет иметь место в моей области стилей.Есть лучший способ сделать это?Как, может быть, есть какой-нибудь способ напрямую связать значение IsSelected строки?

Ответы [ 3 ]

0 голосов
/ 01 сентября 2010

Я согласен, что техника грязная. Я написал класс MultiSelectCollectionView, который может помочь - вы можете найти его здесь: http://grokys.blogspot.com/2010/07/mvvm-and-multiple-selection-part-iii.html

Возможно, вы захотите прочитать предыдущие посты в серии, чтобы понять проблемы с техникой Style / IsSelected.

0 голосов
/ 08 июня 2018

Если вы просто хотите, чтобы булево свойство в вашей модели представления было установлено в значение true при выборе строки в вашей сетке, тогда вам просто нужно связать первое свойство, которое представляет вашу модель в источнике данных, со свойством сетки "SelectedItem" .

После этого вашему логическому свойству нужно только получить значение get, которое возвращает сравнение с нулем вашего первого свойства.

например:

private MyModel __selectedItem;
public MyModel SelectedItem
{
    get {   return _selectedItem; }
    set { 
            if (_selectedItem != value)
            {
                _selectedItem = value;
                RaisePropertyChange("SelectedItem");
            }
        }
 }

 public bool IsItemSelected => SelectedItem != null;
0 голосов
/ 01 сентября 2010

Ну, я не пойду настолько далеко, чтобы сказать, что это "очень плохая форма".Я думаю, что все в порядке.

Для простоты рассмотрим, например, ListBox.Если вы добавляете элементы к нему вручную, вы получите что-то вроде этого:

<ListBox>
  <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item1</ListBoxItem>
  <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item2</ListBoxItem>
  <ListBoxItem IsSelected="{Binding IsSelectedProperty}">Item3</ListBoxItem>
</ListBox>

Это выглядит "хорошо", верно?Вы привязываете непосредственно из фактического элемента управления (то есть ListBoxItems) к свойству в вашей ViewModel.Это несколько отвечает на ваш вопрос.Это еще один способ привязки свойства IsSelected.Вы должны будете вручную добавить элементы в элемент управления.И я не уверен, однако, как вы собираетесь это сделать в DataGrid.

Теперь, если вы собираетесь указать ItemsSource для ListBox (или DataGrid в этом отношении), вынесколько сказать ListBox для автоматической генерации ListBoxItems для вас.И поскольку вы хотите, чтобы свойство IsSelected элемента all объекта ListBoxItems было привязано к вашей ViewModel, имеет смысл определить его в стиле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...