Гиперссылки ListBox - вызов ICommands - PullRequest
1 голос
/ 22 апреля 2009

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

Я создаю приложение MVVM, которое (помимо прочего) отображает список с оповещениями для пользователя. Эти предупреждения относятся к различным рутинным задачам, которые должны выполняться периодически, и каждое предупреждение содержит гиперссылку, которая при нажатии открывает редактор и запись, необходимую для выполнения задачи, связанной с предупреждением.

Моя проблема возникает, когда я пытаюсь связать эти гиперссылки с ICommands. Все команды приложения являются объектами ICommand и отображаются в качестве свойств команды в модели представления. Поэтому обычно привязка к команде так же проста, как Command = "Foo", где Foo - это свойство команды модели представления.

Но это не сработает для моих гиперссылок. И вот почему: ListBox привязан через свойство ItemsSource к свойству коллекции в модели представления с именем Alerts. Эта коллекция состоит из объектов оповещений, которые содержат информацию, необходимую для создания оповещений и связанных с ними гиперссылок.

Однако, поскольку ListBox привязан к коллекции Alerts, его элементы имеют доступ только к этой коллекции, а - к остальной части модели представления! Другими словами, мои гиперссылки не имеют доступ к свойствам команды, с которыми они должны связываться. Command = Foo просто не работает, потому что WPF не может найти свойство Foo в коллекции Alerts, даже если модель представления имеет свойство command с этим именем.

Я могу обойти это довольно уродливым хаком, который включает использование IValueConverter для создания экземпляров ICommands, которые мне нужны. Гиперссылка привязывается к имени нужной ICommand (из объекта Alert), а IValueConverter меняет имя для нового экземпляра самой ICommand.

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

<Hyperlink Command={StaticResource Foo} />My Hyperlink</Hyperlink>

Но я не могу понять, как создать ресурс.

Буду весьма признателен за любые предложения по решению этой проблемы. Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 22 апреля 2009

Почему бы просто не выставить Command из AlertViewModel вместо этого? Даже если он на самом деле получает его из родительской модели представления:

public class MainViewModel
{
    private ICollection<AlertViewModel> _alerts = ...;
    private ICommand _theCommand = ...;

    public ICommand TheCommand
    {
        get { return __theCommand; }
    }

    private void SomeMethod()
    {
        _alerts.Add(new AlertViewModel(this));
    }
}

public class AlertViewModel
{
    private readonly MainViewModel _mainViewModel;

    //ctor omitted

    public ICommand TheCommand
    {
        get { return _mainViewModel.TheCommand; }
    }
}
0 голосов
/ 23 апреля 2009

Я реализовал подход IValueConverter. Решение задокументировано с демонстрационным проектом на The Code Project Надеюсь, это поможет другим в будущем.

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