2009-05-27 5 views
4

Я пытаюсь использовать призму и шаблон MVVM для разработки приложения. В моем пользовательском интерфейсе я определил предыдущую и следующую кнопку. Для использования в вызывающих веб-службах я определил перечисление, которое сообщит мне направление, в котором мне нужно пройти. Таким образом, в этом случае кнопки отображают непосредственно значение перечисления. Определение перечислимого типа очень прост и заключается в следующем:Silverlight 3/Prism - Передача значения enum в качестве параметра команды

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

Я определил свою команду и делегатом в моем ViewModel и назначен Собственость правильно. Соответствующий код:

public DelegateCommand PreviousNextCommand { get; set; } 

public IndexEntriesViewModel(GlobalVariables globalVariable, IndexEntryOperations currentOperator) 
{ 
    //a bunch of initialization code. 
    InitializeCommands(); 
} 

void InitializeCommands() 
{ 
    PreviousNextCommand = 
     new DelegateCommand(OnPreviousNextCommandExecute); 
} 

private void OnPreviousNextCommandExecute(BookDirection parameter) 
{ 

    //Code to process based on BookDirection 
} 

Таким образом, на основе этой конфигурации, я хочу, чтобы передать значение BookDirection перечисления в CommandParameter. Однако я не могу получить XAML для этого. Вот XAML я попробовал, что кажется наиболее правильным для меня:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       mc:Ignorable="d" 
       x:Class="CodeExpert.Book.Views.Index" 
       d:DesignWidth="1024" 
       d:DesignHeight="768" 
       xmlns:helpers="clr-namespace:CodeExpert.Book.Helpers" 
       xmlns:command="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation" 
       xmlns:common="clr-namespace:System.Windows;assembly=System.Windows.Controls" 
       xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" 
       xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" 
       xmlns:input="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input"> 

    <Button x:Name="ButtonPrevious" 
       HorizontalAlignment="Left" 
       Margin="2,1,0,1" 
       Width="25" 
       Content="<" 
       Grid.Column="1" 
       Grid.Row="1" 
       Height="20" 
       command:Click.Command="{Binding Path=CurrentIndexViewModel.PreviousNextCommand}"> 
     <command:Click.CommandParameter> 
      <helpers:BookDirection.Previous /> 
     </command:Click.CommandParameter> 
    </Button> 

</UserControl> 

я не получаю IntelliSense для BookDirection для перечисления и получить ошибку в конструкции & время компиляции произнося «BookDirection» типа не содержит adefinition для 'Предыдущая'. Невозможно передать это перечисление, или я просто что-то пропустил? Теперь я работаю, установив тип параметра string вместо BookDirection, но потом мне нужно разобрать текст и код пахнет. Я сделал некоторые поисковые запросы Google, и самое близкое, что я пришел к ответу, - Passing an enum value as command parameter from XAML К сожалению, Silverlight не поддерживает расширение x: static, поэтому я не могу использовать точный метод, описанный в этом ответе.

Любая помощь будет высоко оценена.

ответ

1

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

Решение, однако, отсутствует в коде фреймворка, но в нем находится LOB Samples. Ищите классы BindableEnum и BindableEnumCollection<T> на проекте Caliburn.Silverlight.ApplicationFramework.

HTH.

0

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

1

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

здесь основной код из DelegateCommand.cs в Prism

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

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

Ваш 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. Но это должно сработать для вас.

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

+0

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

+0

Эй, Стив, мне было интересно, есть ли у вас шанс попробовать это. Мне интересно, если это сработает для вас. –

0

Просто передайте параметр команды, как простой тип объекта. Затем вы можете использовать прямой бросок для своего перечисления.

Смежные вопросы