powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Передача в качестве параметра команды указателя на текущее окно и еще пары вещей
1 сообщений из 1, страница 1 из 1
Передача в качестве параметра команды указателя на текущее окно и еще пары вещей
    #36791715
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток

Реальная задача, по которой нужно конкретное решение, легко распространяемое на сходные задачи.

Есть набор однотипных устройств, подключенных через СОМ-порты, ими нужно управлять. Пишем программу, на главном окне которой имеется набор контролов, задающих общие настройки для всех СОМ-портов и есть шаблонизированный ListBox, каждый элемент которого - отдельное устройство, подключенное через СОМ-порт. DataContext окна - класс, свойства которого - общие настройки и отдельное свойство - ObservableCollection с элементами - экземплярами класса-контроллера устройства. Класс контроллера реализует команду - "ВКЛ/ВЫКЛ устройство", соответственно, каждый ListBoxItem у вышеупомянутого ListBox'a имеет кнопку, выполняющую эту команду.

Проблема в том, что перед выполнением команды на включение устройства неплохо бы проверить, все ли параметры введены верно, т.е. нет ли ошибок валидации. Причем важно сделать эту проверку на стороне модели, а не в behind-коде представления (окна).

Модель данных построена примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    public class ViewModel : INotifyPropertyChanged, IDataErrorInfo
    {
        // свойства - общие настройки всех СОМ-портов, к которым подключены устройства
        public int BaudRate {}
        ...

        // коллекция подключенных устройств
        public ObservableCollection<Device> Devices {}
    }

    // контроллер устройства
    public class Device : INotifyPropertyChanged, IDataErrorInfo
    {
        // свойства, управляющие подключением
        public int Adress {}
        public int Port {}
        ...

        // команда включения/выключения устройства
        public ICommand SwitchCommand {}
    }

Шаблон ListBoxItem, соответствующего одному устройству, выглядит вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<ControlTemplate x:Key="DevicesListBoxItemTemplate">
  <Grid Name="xxx">
    <Grid.ColumnDefinitions>
      ...
    </Grid.ColumnDefinitions>
    <TextBox Grid.Column="0" Text="{Binding Path=Number, UpdateSourceTrigger=PropertyChanged, 
             ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"/>
    <TextBox Grid.Column="1" Text="{Binding Path=Port, UpdateSourceTrigger=PropertyChanged, 
             ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"/>
    <Button Grid.Column="2" Margin="0,0,5,0" Command="{Binding Path=SwitchCommand}"/>
  </Grid>
</ControlTemplate>

Логика такова, что перед выполнением команды (например в ICommand.CanExecute) нужно проверить, нет ли ошибок валидации у контролов окна (но не всех) и ошибок валидации у контролов данного ListBoxItem (адреса устройства и его СОМ-порта). Это можно успешно сделать, если в качестве параметра команды передать массив с контролами (как общими, так и данного ListBoxItem'a, но не других устройств-ListBoxItem'ов).

И, наконец, вопрос: как в XAML передать (например, через Binding) не свойство какого-либо контрола, а ссылку на него самого? И как в XAML передать ссылку на данный ListBoxItem?

Например, вот этот вариант успешно передает в CommandParameter значение свойства IsSelected того ListBoxItem'a, к дереву потомков которого относится кнопка (см. шаблон выше), а как передать сам этот ListBoxItem?
Код: plaintext
1.
2.
3.
4.
5.
6.
<Button DataContext="{Binding}"
        Command="{Binding Path=SwitchCommand}"
        CommandParameter="{Binding Path=IsSelected, RelativeSource={
                                                RelativeSource
                                                Mode=FindAncestor,
                                                AncestorType={x:Type ListBoxItem}}}"/>
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Передача в качестве параметра команды указателя на текущее окно и еще пары вещей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]