文档半岛外围网上直营>>DevExpress WinForm中文手册>>Fluent API支持
Fluent API支持
Fluent APIs利用方法级联传递后续调用的指令上下文,通过这样做,Fluent API遵循与人们使用的相同的自然语言规则。因此,构造良好的Fluent API提供了更易于感知和理解的人性化代码。
要开始了解Fluent API概念,请参考以下文章。
- 了解
一篇由Sacha Barber撰写的Code Project博客文章,描述了什么是Fluent API以及为什么应该使用它。
MSDN文档部分描述了实体框架范围内的Fluent API。
DevExpress MVVM框架提供了扩展方法来为任何任务构建流畅的API表达式:从绑定简单的属性到将MVVM行为与特定事件关联起来。
属性绑定和UI触发器
- 简单的属性绑定。
C#:
mvvmContext.ViewModelType = typeof(ViewModel);
var fluentAPI = mvvmContext.OfType<ViewModel>();
fluentAPI.SetBinding(editor, e => e.EditValue, x => x.Title);
//ViewModel
public virtual string Title { get; set; }
VB.NET:
mvvmContext.ViewModelType = GetType(ViewModel)
Dim fluentAPI = mvvmContext.OfType(Of ViewModel)()
fluentAPI.SetBinding(editor, Function(e) e.EditValue, Function(x) x.Title)
'ViewModel
public virtual String Title {get;set;}
- 绑定到嵌套属性。
C#:
mvvmContext.ViewModelType = typeof(ViewModel);
var fluent = mvvmContext.OfType<ViewModel>();
fluent.SetBinding(editor, e => e.EditValue, x => x.Child.Title);
//ViewModel
public NestedViewModel Child { get; private set; }
//NestedViewModel
public virtual string Title { get; set; }
VB.NET:
mvvmContext.ViewModelType = GetType(ViewModel)
Dim fluent = mvvmContext.OfType(Of ViewModel)()
fluent.SetBinding(editor, Function(e) e.EditValue, Function(x) x.Child.Title)
'ViewModel
public NestedViewModel Child {get;private set;}
'NestedViewModel
public virtual String Title {get;set;}
- UI 触发器。
C#:
mvvmContext.ViewModelType = typeof(UIViewModel);
var fluentAPI = mvvmContext.OfType<UIViewModel>();
fluentAPI.SetTrigger(x => x.IsActive, (active) =>
{
label.Text = active ? "Active" : "Inactive";
});
//UIViewModel
public virtual bool IsActive { get; set; }
VB.NET:
mvvmContext.ViewModelType = GetType(UIViewModel)
Dim fluentAPI = mvvmContext.OfType(Of UIViewModel)()
fluentAPI.SetTrigger(Function(x) x.IsActive, Sub(active)
label.Text = If(active, "Active", "Inactive"))
'UIViewModel
public virtual Boolean IsActive {get;set;}
命令绑定
- 带有CanExecute条件的参数化命令。
C#:
mvvmContext.ViewModelType = typeof(ViewModel);
int parameter = 4;
var fluentAPI = mvvmContext.OfType<ViewModel>();
fluentAPI.BindCommand(commandButton, (x, p) => x.DoSomething(p), x => parameter);
//ViewModel
public class ViewModel {
public void DoSomething(int p) {
//. . .
}
public bool CanDoSomething(int p) {
return (2 + 2) == p;
}
}
VB.NET:
mvvmContext.ViewModelType = GetType(ViewModel) Dim parameter As Integer = 4 Dim fluentAPI = mvvmContext.OfType(Of ViewModel)() fluentAPI.BindCommand(commandButton, Function(x, p) x.DoSomething(p), Function(x) parameter) 'ViewModel public class ViewModel public void DoSomething(Integer p) '. . . public Boolean CanDoSomething(Integer p) Return (2 + 2) = p
- 异步命令。
C#:
mvvmContext.ViewModelType = typeof(ViewModel);
var fluentAPI = mvvmContext.OfType<ViewModel>();
fluentAPI.BindCommand(commandButton, x => x.DoSomethingAsynchronously());
fluentAPI.BindCancelCommand(cancelButton, x => x.DoSomethingAsynchronously());
//ViewModel
public class ViewModelWithAsyncCommandAndCancellation
public Task DoSomethingAsynchronously() {
return Task.Factory.StartNew(() =>
{
var asyncCommand = this.GetAsyncCommand(x => x.DoSomethingAsynchronously());
for(int i = 0; i <= 100; i++) {
if(asyncCommand.IsCancellationRequested) // cancellation check
break;
//. . .
}
});
}
}
VB.NET:
mvvmContext.ViewModelType = GetType(ViewModel) Dim fluentAPI = mvvmContext.OfType(Of ViewModel)() fluentAPI.BindCommand(commandButton, Function(x) x.DoSomethingAsynchronously()) fluentAPI.BindCancelCommand(cancelButton, Function(x) x.DoSomethingAsynchronously()) 'ViewModel public class ViewModelWithAsyncCommandAndCancellation public Task DoSomethingAsynchronously() Return Task.Factory.StartNew(Sub() ' cancellation check '. . . Dim asyncCommand = Me.GetAsyncCommand(Function(x) x.DoSomethingAsynchronously()) For i As Integer = 0 To 100 If asyncCommand.IsCancellationRequested Then Exit For End If Next i End Sub) }
- WithCommand扩展允许您将命令绑定到一个或多个目标UI元素。
C#:
//binding to one UI element fluent.WithCommand(x => x.DoSomething()) .Bind(btnDoSomething); //binding to multiple UI elements fluent.WithCommand(x => x.DoSomething()) .Bind(btn1DoSomething) .Bind(btn2DoSomething); fluent.WithCommand(x => x.DoSomethingAsynchronously()) .Bind(btnDo) .BindCancel(btnCancel);
VB.NET:
'binding to one UI element fluent.WithCommand(Function(x) x.DoSomething()). Bind(btnDoSomething) 'binding to multiple UI elements fluent.WithCommand(Function(x) x.DoSomething()) .Bind(btn1DoSomething) .Bind(btn2DoSomething) fluent.WithCommand(Function(x) x.DoSomethingAsynchronously()) .Bind(btnDo) .BindCancel(btnCancel)
- 命令触发器允许您在目标命令执行之前、之后或该命令的CanExecute条件发生变化时自动调用特定的方法。
C#:
fluent.WithCommand(x => x.DoSomething()) .After(() => AfterDoSomethingExecuted()); fluent.WithCommand(x => x.DoSomething()) .Before(() => BeforeDoSomethingExecuted()); fluent.WithCommand(x => x.DoSomething()) .OnCanExecuteChanged(() => WhenCanDoSomethingChanged());
VB.NET:
fluent.WithCommand(Function(x) x.DoSomething()) .After(Function() AfterDoSomethingExecuted()) fluent.WithCommand(Function(x) x.DoSomething()) .Before(Function() BeforeDoSomethingExecuted()) fluent.WithCommand(Function(x) x.DoSomething()) .OnCanExecuteChanged(Function() WhenCanDoSomethingChanged())
附加操作
- 确认操作 。
C#:
mvvmContext.WithEvent<ChangingEventArgs>(editor, "EditValueChanging")
.Confirmation(behavior =>
{
behavior.Caption = "CheckEdit State changing";
behavior.Text = "This checkEdit's checked-state is about to be changed. Are you sure?";
});
VB.NET:
mvvmContext.WithEvent(Of ChangingEventArgs)(editor, "EditValueChanging").Confirmation(Sub(behavior) behavior.Caption = "CheckEdit State changing" behavior.Text = "This checkEdit's checked-state is about to be changed. Are you sure?" End Sub)
- Event-To-Command操作。
C#:
mvvmContext.ViewModelType = typeof(ViewModel);
mvvmContext.WithEvent<ViewModel, EventArgs>(thirdPartyButton, "Click")
.EventToCommand(x => x.DoSomething());
//ViewModel
public void DoSomething() {
//. . .
}
VB.NET:
mvvmContext.ViewModelType = GetType(ViewModel) mvvmContext.WithEvent(Of ViewModel, EventArgs)(thirdPartyButton, "Click").EventToCommand(Function(x) x.DoSomething()) 'ViewModel Public Sub DoSomething() '. . . End Sub
- 键到命令和键到命令操作。
C#:
mvvmContext.OfType<KeyAwareViewModel>()
.WithKey(memo, Keys.A)
.KeyToCommand(x => x.OnAKey());
mvvmContext.OfType<KeyAwareViewModel>()
.WithKeys(memo, new Keys[] { Keys.A, Keys.B, Keys.C })
.KeysToCommand(x => x.OnKey(Keys.None), args => args.KeyCode);
VB.NET:
mvvmContext.OfType(Of KeyAwareViewModel)().WithKey(memo, Keys.A).KeyToCommand(Function(x) x.OnAKey())
mvvmContext.OfType(Of KeyAwareViewModel)().WithKeys(memo, New Keys() { Keys.A, Keys.B, Keys.C }).KeysToCommand(Function(x) x.OnKey(Keys.None), Function(args) args.KeyCode)

QQ交谈
在线咨询

渝公网安备
50010702500608号

客服热线