2011-10-13 39 views
16

Tôi có một kiểu và tôi muốn liên kết lệnh với của EventSetter với RelativeSource. Lệnh nằm trong viewModel.wpf eventsetter handler ràng buộc theo kiểu

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}"> 
    <EventSetter Event="MouseLeftButtonDown" 
       Handler="{Binding TextBlockMouseLeftButtonDownCommand, 
          RelativeSource={RelativeSource Self}}"/> 
</Style> 

Vấn đề là tôi nhận được một lỗi, vì cái gì là sai với điều này (có lẽ nó không thể làm điều này trong một cách dễ dàng như vậy)

Tôi đã googled rất nhiều trước đó, và tôi thấy các AttachedCommandBehaviour, nhưng tôi nghĩ rằng nó không hoạt động với phong cách.

Bạn có thể đưa ra một số gợi ý về cách giải quyết vấn đề này không?

Cập nhật 13/10/2011

Tôi thấy điều này trong MVVM nhẹ Toolkit EventToCommand dụ chương trình:

 <Button Background="{Binding Brushes.Brush1}" 
      Margin="10" 
      Style="{StaticResource ButtonStyle}" 
      Content="Simple Command" 
      Grid.Row="1" 
      ToolTipService.ToolTip="Click to activate command"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <cmd:EventToCommand Command="{Binding SimpleCommand}" /> 
      </i:EventTrigger> 
      <i:EventTrigger EventName="MouseLeave"> 
       <cmd:EventToCommand Command="{Binding ResetCommand}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Button> 

Nhưng ở đây, các ràng buộc không có trong phong cách. Làm thế nào tôi có thể đặt EventToCommand này vào kiểu nút?

Trả lời

21

Ngay bây giờ bạn đang ràng buộc MouseLeftButtonDown tổ chức sự kiện để TextBlock.TextBlockMouseLeftButtonDownCommand. TextBlockMouseLeftButtonDownCommand không phải là một thuộc tính hợp lệ cho một TextBlock, cũng không có vẻ như nó là một Event Handler.

Tôi sử dụng AttachedCommandBehavior tất cả thời gian trong các kiểu để gắn một Lệnh vào sự kiện. Cú pháp thường trông như thế này (chú ý DataContext trong Bộ chỉ huy Binding):

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}"> 
    <Setter Property="local:CommandBehavior.Event" Value="MouseLeftButtonDown" /> 
    <Setter Property="local:CommandBehavior.Command" 
      Value="{Binding DataContext.TextBlockMouseLeftButtonDownCommand, 
          RelativeSource={RelativeSource Self}}" /> 
</Style> 

Cách khác là để níu kéo EventSetter lên đến một sự kiện trong code-behind, và xử lý lệnh từ đó:

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}"> 
    <EventSetter Event="MouseLeftButtonDown" 
       Handler="TextBlockMouseLeftButtonDown"/> 
</Style> 

xử lý sự kiện trong mã đằng sau ...

void TextBlockMouseLeftButtonDown(object sender, MouseEventArgs e) 
{ 
    var tb = sender as TextBlock; 
    if (tb != null) 
    { 
     MyViewModel vm = tb.DataContext as MyViewModel; 

     if (vm != null && TextBlockMouseLeftButtonDownCommand != null 
      && TextBlockMouseLeftButtonDownCommand.CanExecute(null)) 
     { 
      vm.TextBlockMouseLeftButtonDownCommand.Execute(null) 
     } 
    } 
} 
+0

Ý tưởng hay là đặt lệnh thực hiện cho sự kiện, nhưng tôi sẽ thử AttachCommandBehavior vào ngày mai! Cảm ơn rất nhiều câu trả lời! –

+0

AttachCommandBehavior hoạt động hoàn hảo. Một điều mà tôi không chắc chắn làm thế nào để giải quyết. Tôi muốn ràng buộc các lệnh không chỉ cho một sự kiện và tôi đã tìm thấy loại giải pháp sau: http://stackoverflow.com/questions/926451/how-can-i-attach-two-attached-behaviors-to-one- xaml-element Nó thực sự tốt, nhưng làm thế nào tôi có thể đặt CommandBehaviorCollection này cho phong cách? Cảm ơn trước vì câu trả lời của bạn! –

+0

@ ZoltánBarna Nó có vẻ không hoạt động trong Kiểu hoặc Mẫu – Rachel

3

Như bạn đang sử dụng MVVM, tôi đề nghị bạn Galasoft MVVM Light ToolkitEventToCommand

+0

Tôi đã xem ví dụ với hình chữ nhật và trình kích hoạt sự kiện, và nó cũng hoạt động với các bản ghi sự kiện? –

0

My answer trên this question hiện các trick mà không cần bất kỳ bộ dụng cụ công cụ bên ngoài/thư viện. Tuy nhiên, nó không sử dụng RelativeSource, và nó không phải là 100% MVVM. Nó yêu cầu một dòng mã trong trình xử lý sự kiện mã-đằng sau.

Các vấn đề liên quan