将功能绑定到列表框c#WPF中的文本块

时间:2015-12-19 02:49:30

标签: c# wpf xaml mvvm listbox

我正在学习MVVM,因此它可能是新手问题。

我需要绑定函数:

private void doubleClick(object sender, MouseButtonEventArgs e)
文本块中的

<Grid>
    <ListBox Name="mediaList" Grid.Row="1"
             ItemsSource="{Binding Medias}"
             IsSynchronizedWithCurrentItem="True">
        <ListBox.ItemTemplate>
            <DataTemplate DataType="{x:Type Models:Media}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="icon-play-128.png" Margin="0,0,5,0" />
                    <TextBlock Text="{Binding Name}" Margin="0,0,5,0">
                        <TextBlock.InputBindings>
                            <MouseBinding Command="{Binding DoubleClick}" Gesture="LeftDoubleClick" />
                        </TextBlock.InputBindings>
                    </TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

但第一个问题是DoubleClick在我的视图模型中而不在我的类媒体中(在模型中)。

另一个问题是我需要接收两个参数我该怎么做?

如果您有更好的方法,请向我解释。

提前致谢。

1 个答案:

答案 0 :(得分:3)

  1. 要链接Command及其Execute方法,您可以使用委托。 MSDN有很好的证明这一点的例子。见那里的例子。

  2. 其次,您实际上是在尝试处理MouseDoubleClick事件。但是,Control类公开了MouseDoubleClick事件。 TextBlock不是控件。因此,最好将TextBlock包装在ContentControl中。

    <ContentControl MouseDoubleClick="ContentControl_MouseDoubleClick">
            <TextBlock ... />
    </ContentControl>
    
  3. 然后从您的事件处理程序中以编程方式调用您的命令。

    1. 如果您希望将所有内容解除耦合,并且处理该事件非常重要,那么请编写一个行为。在该行为中,您可以附加MouseDoubleClick事件处理程序,并执行您喜欢的任何操作。您可以在适合您需要的行为中引入您自己的属性。

      using System.Windows.Interactivity;
      
      public class MyBehavior : Behavior<ContentControl>
      { 
           public MyBehavior()
           {}
      
           protected override void OnAttached()
           {
               AssociatedObject.MouseDoubleClick += AssociatedObject_MouseDoubleClick;
               base.OnAttached();
           }
      
           protected override void OnDetaching()
           {
               AssociatedObject.MouseDoubleClick -= AssociatedObject_MouseDoubleClick;
           }
      
           void AssociatedObject_MouseDoubleClick(object sender, MouseButtonEventArgs e)
           {
               // do something
           }
      }
      
    2. XAML用法:

      <ContentControl ...
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" >
         <TextBlock .../>
         <i:Interaction.Behaviors>
             <local:MyBehavior />       
         </i:Interaction.Behaviors>
      </ContentControl>