2009-05-27 98 views
4

我正在嘗試使用Prism和MVVM模式來開發應用程序。在我的用戶界面中,我定義了一個上一個和下一個按鈕。爲了在調用Web服務中使用,我定義了一個枚舉,它會告訴我需要遍歷的方向。因此,在這種情況下,按鈕直接映射到枚舉值。枚舉的定義非常簡單,如下:Silverlight 3/Prism - 將枚舉值作爲命令參數傳遞

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

我定義我的命令,並委託我的視圖模型和正確分配的屬性格式。相關代碼是:

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> 

我沒有得到任何智能感知爲BookDirection爲枚舉並獲得設計&編譯時錯誤說類型「BookDirection」不包含對'以前'的定義。有沒有辦法通過該枚舉,或者我只是失去了一些東西?我現在通過將參數類型設置爲string而不是BookDirection,然後我必須解析文本和代碼的氣味。我已經完成了一些Google搜索,並且我已經找到了最接近的答案 - Passing an enum value as command parameter from XAML不幸的是,Silverlight不支持x:static綁定擴展,因此我無法使用該答案中描述的確切技術。

任何幫助將不勝感激。

回答

1

即使在WPF中,綁定枚舉實際上也是一個麻煩的操作。但似乎有一個優雅的解決方案,可在Caliburn框架中找到。

但是,該解決方案在框架代碼中不可用,但在其中的LOB Samples。查找Caliburn.Silverlight.ApplicationFramework項目上的BindableEnumBindableEnumCollection<T>類。

HTH。

0

我沒有嘗試過自己,但你可能有一些成功使用ValueConverter從類似字符串的東西到你的枚舉。這是我在Silverlight xaml中尋找枚舉的印象。

1

首先,我不確定您是否可以直接從Silverlight中的XAML傳遞Enum。在任何情況下,這都是Prism中的一個小問題。請參閱命令在CommandParameter之前設置,當命令在內部設置時會發生什麼情況Prism調用UpdateEnabledState(),它在內部調用DelegateCommand的CanExecute(對象參數),並將CommandParameter傳遞給CommandParameter(記得還沒有設置)

這裏是DelegateCommand.cs在棱鏡

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

的基本代碼,因爲參數是在這一點上「零」,劇組拋出異常。這是我如何解決這個問題。

Your Enum。

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

這裏是我的委託聲明,請注意使用object..rather而不是Enum本身。我也暴露了ViewModel中的屬性,它會暴露兩個不同的方向。

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到視圖模型。但這應該適合你。

對不起我的英語和口才不佳,希望這會讓你走上正軌。

+0

斯坦,你的英語和口才都很好。我實際上已經把這個項目放在了後面,但本週可能會再次出現。我會嘗試一下你的技術。 – 2009-07-13 12:51:30

0

只需傳遞像簡單對象類型的命令參數即可。然後你可以直接使用你的枚舉。