2013-06-20 3 views
3

WPF не определяет расширение разметки, которое будет использоваться для событий, третьи стороны могут создать расширение разметки, которое может использоваться с событиями. Теперь WPF 4.5 поддерживает расширения разметки для событий. Может ли кто-нибудь помочь, как добиться этого в .Net 4.5 с элегантным примером?Расширения разметки для событий в .Net 4.5

+0

Что именно вы пытаетесь достичь? Регистрация обработчика событий в XAML? –

+0

Justin - спасибо за ваш быстрый ответ. 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

Красивая. Если бы только Microsoft продолжала вкладывать деньги в WPF ... Я просто надеюсь, что все эти функции будут доступны в WinRT ... или в какой-либо другой частичной форме, которую они придумали. –

+0

@Adi, Спасибо, приятель, я протестировал приложение и его рабочий штраф –

1

Команда

{ЭБ: EventBinding} (Простой шаблон именования, чтобы найти команды)

{ЭБ: EventBinding Command = Имя_команды}

CommandParameter

$ е (EventAgrs)

$ этот или $ этот. Свойство

строка

https://github.com/JonghoL/EventBindingMarkup

+0

Nice. Это была функция убийцы, отсутствующая в WPF. Большая часть технологий Microsoft. не имеет для меня никакого смысла. Не в последнюю очередь это произвольное различие между командами и событиями. UI - это просто источник событий, но неспособность обеспечить надежный сигнал - это множество событий обратно в модель представления, не прибегая к коду. Э-э? Их возможное решение было настолько подробным и требовало третьей библиотеки ... А? ... – 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); 
}