Silverlight 3/призма - Передача перечисления значений как Параметр Команды

<context:property-placeholder location="classpath*:spring/*.properties" />

Если вы поместите его где-нибудь в classpath в каталог с именем spring (соответственно измените имена / каталоги), вы можете получить доступ с помощью выше

<property name="locations" value ="config/springcontext.properties" />

, это будет указывать на web-inf / классы / Config / springcontext.properties

5
задан Community 23 May 2017 в 10:27
поделиться

3 ответа

Привязка перечислений - действительно неприятная операция, даже в WPF. Но, похоже, есть изящное решение, которое доступно в рамках Caliburn .

Решение, однако, доступно не в коде фреймворка, а в его LOB Samples . Найдите классы BindableEnum и BindableEnumCollection в проекте Caliburn.Silverlight.ApplicationFramework .

HTH.

1
ответ дан 14 December 2019 в 19:23
поделиться

Я сам не пробовал, но вы можете успешно использовать ValueConverter из чего-то вроде строки в ваше перечисление. Такое впечатление у меня сложилось, когда я искал перечисления в Silverlight xaml.

0
ответ дан 14 December 2019 в 19:23
поделиться

Во-первых, я не уверен, можно ли передать Enum прямо из XAML в Silverlight. В любом случае в Prism есть небольшая проблема. Посмотрите, что команда устанавливается перед CommandParameter, что происходит, когда команда устанавливается внутри Prism вызывает UpdateEnabledState (), который внутренне вызывает CanExecute (параметр объекта) в вашем DelegateCommand, передавая ему CommandParameter (который, как мы помним, еще не был установлен)

вот базовый код из DelegateCommand.cs в Prism

 bool ICommand.CanExecute(object parameter)
    {
        return CanExecute((T)parameter);
    }

, поскольку параметр в этот момент имеет значение «null», приведение выдает исключение. Вот как я обошел эту проблему.

Your Enum.

namespace CodeExpert.Book.Helpers
{
    public enum BookDirection { Previous = -1, NotSet = 0, Next = 1, }
}

вот мое объявление делегата, обратите внимание на использование объекта ... а не самого Enum. Я также выставляю свойства из ViewModel, которые будут отображать 2 разных направления.

public DelegateCommand<object> PreviousNextCommand { get; set; }

public BookDirection Previous { get { return BookDirection.Previous; }}
public BookDirection Next { get { return BookDirection.Next; }}

теперь в вашем OnPreviousNextCommandExecute убедитесь, что вы получили объект и вернули его к правильному перечислению

private void OnPreviousNextCommandExecute(object parameter)
{

    BookDirection direction = (BookDirection)parameter;

    //Code to process based on BookDirection
}

, а в XAML привяжите напрямую к открытым свойствам BookDirection.

<Button Content="Next"  Commands:Click.Command="{Binding PreviousNextCommand}" Commands:Click.CommandParameter="{Binding Next}" />
<Button Content="Previous" Commands:Click.Command="{Binding PreviousNextCommand}" Commands:Click.CommandParameter="{Binding Previous}" />

Я не уверен в вашей ситуации привязки, как в моем случае Я установил свой DataContext непосредственно в ViewModel. Но это должно сработать для вас.

Извините за мой плохой английский и красноречие, надеюсь, это приведет вас на правильный путь.

1
ответ дан 14 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: