Привязка данных к функциям в динамически загружаемых плагинах - PullRequest
0 голосов
/ 27 января 2010

У меня есть несколько MenuItems, чьи команды привязаны к моей модели представления. До сегодняшнего дня все они выполняются должным образом.

Теперь я добавил MenuItem, у которого ItemsSource связан с ObservableCollection. Задача этого MenuItem - перечислить список плагинов, чтобы отображались имена всех плагинов. Затем, когда пользователь нажимает на имя плагина, он должен вызвать функцию для отображения свойств для аудио фильтров.

В моей текущей реализации, которая не работает, я попытался связать данные следующим образом:

<MenuItem Header="Filters" ItemsSource="{Binding FilterPluginNames}">
    <MenuItem.ItemContainerStyle>
        <Style>
            <Setter Property="MenuItem.Command" Value="{Binding ShowFilterDialogCommand}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>

Проблема в том, что я получаю ошибку пути BindingExpression, потому что он пытается использовать строку в качестве DataContext объекта MenuItem.

Это наводит меня на мысль, что DataContext для MenuItem для MenuItem автоматически устанавливается на тип объектов в ItemsSource. Это правда?

Если мне нужно изменить DataContext, то я бы хотел изменить его на ViewModel, который обрабатывает все остальные мои команды. Но если я сделаю это, как в мире я могу сказать, для какого плагина я хочу отображать свойства фильтра? Мне нужно как минимум передать CommandParameter, но привязка этого значения к имени фильтра - не самый любимый вариант. Есть ли другие способы сделать это?

Если для DataContext действительно автоматически задан тип объекта в ObservableCollection, то я бы просто вызвал метод интерфейса ShowFilterProperties () напрямую. Могу поспорить, что я не могу сделать это без привязки команд. Если это так, как вы все имеете дело с такого рода приложениями? Вы заставляете все плагины выставлять обработчик команд, который затем показывает диалог?

РЕДАКТИРОВАТЬ - Я изменил свой код, чтобы изменить тип ObservableCollection, и, конечно же, WPF хочет привязать данные к типу T. Поэтому я предполагаю, что один из вариантов заключается в том, чтобы плагин выставлял ICommand, но Я не знаю, странный ли это подход или нет?

РЕДАКТИРОВАТЬ - хорошо, я только что узнал что-то новое. Интерфейсы не могут иметь полей, поэтому нельзя ли связывать данные с плагинами, точка?

1 Ответ

1 голос
/ 27 января 2010

Вы, вероятно, не совсем обязательны, как вы думаете. Возможно, вы захотите просто поставить некоторую диагностику на свои привязки и посмотреть, к какому объекту они привязываются. Вот хорошая ссылка для отладки привязок:

http://www.beacosta.com/blog/?p=52

Вот пример:

<Window …
    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    />

    <TextBlock Text="{Binding Path=Caption, diagnostics:PresentationTraceSources.TraceLevel=High}" … />

Я думаю, что ваш подход верен ... возможно, его просто нужно немного отладить.

...