2013-06-20 48 views
3

WPF未定義用於事件的標記擴展,第三方能夠創建可用於事件的標記擴展。現在WPF 4.5支持事件的標記擴展。任何人都可以通過一個優雅的例子來幫助如何在.Net 4.5中實現這一點?.Net 4.5中事件的標記擴展

+0

您究竟在做什麼?在XAML中註冊事件處理程序? –

+0

賈斯廷 - 感謝您的快速響應.. http://msdn.microsoft.com/en-us/library/bb613588.aspx#events_markup_extenions我發現了一個新的功能,搜索了一些好的樣本,沒有得到任何樣本 –

+0

@VimalCk,我也一直在努力。只需要提一下,4.5還可以讓您使用泛型來反映屬性,這會加速標記擴展! –

回答

5

事件標記擴展允許您爲事件使用標記擴展,直到WPF 4.5爲止,它們只能用於屬性。例如:

<Canvas ClipToBounds="True" Background="White" 
     MouseLeftButtonDown="{local:EventToCommand StartPaintCommand}" 
     MouseMove="{local:EventToCommand AddLineCommand}" 
     MouseLeftButtonUp="{local:EventToCommand EndPaintCommand}"> 
</Canvas> 

可以找到一個完整的例子here

+0

美麗。如果只有微軟繼續在WPF中投入資金......我只希望所有這些功能都可以在WinRT中使用......或者其他任何其他未完成的框架。 –

+0

@Adi,謝謝哥們,我已經測試了應用程序,它的工作正常 –

1

命令

{EB:EventBinding}(簡單的命名模式來查找命令)

{EB:EventBinding命令=的CommandName}

CommandParameter

$ E( EventAgrs)

$ this或$ this。物業

https://github.com/JonghoL/EventBindingMarkup

+0

不錯。這是WPF缺少的一個殺手級功能。許多微軟的技術。對我沒有意義。其中最重要的是命令和事件之間的這種任意區分。用戶界面只是一個事件源,但未能提供一種可靠的方法,將大量的事件返回到視圖模型,而無需訴諸代碼。呃?他們最終的解決方案非常冗長,需要第三個圖書館......呃? ... – George

0

這是一個非常靈活的標記擴展我寫的,可以直接事件綁定到你的視圖模型方法的一個例子:

http://www.singulink.com/CodeIndex/post/building-the-ultimate-wpf-event-method-binding-extension

用法:

<!-- Basic usage --> 
<Button Click="{data:MethodBinding OpenFromFile}" Content="Open" /> 

<!-- Pass in a binding as a method argument --> 
<Button Click="{data:MethodBinding Save, {Binding CurrentItem}}" Content="Save" /> 

<!-- Another example of a binding, but this time to a property on another element --> 
<ComboBox x:Name="ExistingItems" ItemsSource="{Binding ExistingItems}" /> 
<Button Click="{data:MethodBinding Edit, {Binding SelectedItem, ElementName=ExistingItems}}" /> 

<!-- Pass in a hard-coded method argument, XAML string automatically converted to the proper type --> 
<ToggleButton Checked="{data:MethodBinding SetWebServiceState, True}" 
       Content="Web Service" 
       Unchecked="{data:MethodBinding SetWebServiceState, False}" /> 

<!-- Pass in sender, and match method signature automatically --> 
<Canvas PreviewMouseDown="{data:MethodBinding SetCurrentElement, {data:EventSender}, ThrowOnMethodMissing=False}"> 
    <controls:DesignerElementTypeA /> 
    <controls:DesignerElementTypeB /> 
    <controls:DesignerElementTypeC /> 
</Canvas> 

    <!-- Pass in EventArgs --> 
<Canvas MouseDown="{data:MethodBinding StartDrawing, {data:EventArgs}}" 
     MouseMove="{data:MethodBinding AddDrawingPoint, {data:EventArgs}}" 
     MouseUp="{data:MethodBinding EndDrawing, {data:EventArgs}}" /> 

<!-- Support binding to methods further in a property path --> 
<Button Content="SaveDocument" Click="{data:MethodBinding CurrentDocument.DocumentService.Save, {Binding CurrentDocument}}" /> 

查看模型方法簽名:

public void OpenFromFile(); 
public void Save(DocumentModel model); 
public void Edit(DocumentModel model); 

public void SetWebServiceState(bool state); 

public void SetCurrentElement(DesignerElementTypeA element); 
public void SetCurrentElement(DesignerElementTypeB element); 
public void SetCurrentElement(DesignerElementTypeC element); 

public void StartDrawing(MouseEventArgs e); 
public void AddDrawingPoint(MouseEventArgs e); 
public void EndDrawing(MouseEventArgs e); 

public class Document 
{ 
    // Fetches the document service for handling this document 
    public DocumentService DocumentService { get; } 
} 

public class DocumentService 
{ 
    public void Save(Document document); 
}