我正在尝试使用Prism和MVVM模式来开发应用程序。在我的UI中,我定义了上一个和下一个按钮。为了在调用Web服务中使用,我已经定义了一个枚举,它将告诉我需要遍历的方向。因此,在这种情况下,按钮直接映射到枚举值。枚举定义非常简单,如下所示:
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>
我没有获得枚举的BookDirection的智能感知,并且在设计时遇到错误编译时说'类型'BookDirection'不包含'Previous'的定义。有没有办法通过那个枚举,或者我只是遗漏了什么?我现在通过将参数类型设置为string
而不是BookDirection
来使用它,但是我必须解析文本并且代码闻起来。我已经完成了一些Google搜索,而我最接近答案的就是这里 - Passing an enum value as command parameter from XAML不幸的是,Silverlight不支持x:static绑定扩展,因此我无法使用所描述的确切技术在那个答案中。
非常感谢任何帮助。
答案 0 :(得分:2)
只需传递命令参数,如简单对象类型。然后你可以直接使用你的枚举。
答案 1 :(得分:1)
首先,我不确定您是否可以直接从Silverlight中的XAML传递Enum。无论如何,这里的棱镜有点问题。在CommandParameter之前看到命令正在设置,当命令在内部设置时会发生什么Prism调用UpdateEnabledState(),它在DelegateCommand上内部调用CanExecute(对象参数)传递CommandParameter(记得还没有设置)< / p>
这是Prism中 DelegateCommand.cs 的基本代码
bool ICommand.CanExecute(object parameter)
{
return CanExecute((T)parameter);
}
因为此时参数为“null”,所以cast会抛出异常。以下是我解决这个问题的方法。
你的枚举。
namespace CodeExpert.Book.Helpers
{
public enum BookDirection { Previous = -1, NotSet = 0, Next = 1, }
}
这是我的委托声明,注意使用object..rather而不是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。但这应该适合你。
对不起我的英语和口才不好,希望这会让你走上正轨。
答案 2 :(得分:1)
绑定枚举实际上是一个麻烦的操作,即使在WPF中也是如此。但似乎有一个优雅的解决方案,可以在Caliburn
框架中找到。
然而,解决方案在框架代码中不可用,但在LOB Samples
中。在BindableEnum
项目中查找BindableEnumCollection<T>
和Caliburn.Silverlight.ApplicationFramework
类。
HTH。
答案 3 :(得分:0)
我自己没有尝试过,但你可能会有一些成功使用ValueConverter从字符串到你的枚举。这是我在Silverlight xaml中寻找枚举的印象。