2

WPF には、ObservableCollection にバインドされたリストビューがあります。

XAML:

<ListView Name="listView" DockPanel.Dock="Top" ItemsSource="{Binding Path=ListOfOldData}" SelectedItem="{Binding Path=SelectedOldData, Mode=TwoWay}" SelectionMode="Single">
        <ListView.ContextMenu>
            <ContextMenu>
              <Button Content="Load" Command="{Binding Path=LoadCommand}"  Name="loadButton" Height="23" Width="75" DockPanel.Dock="Left"/>             
              <!-- Is working just fine -->         
            </ContextMenu>
        </ListView.ContextMenu>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"
                           Text="{Binding Path=Name}" FontWeight="Bold"><TextBlock Text=" - " FontWeight="Normal"/><TextBlock Text="{Binding Path=UpdateDatum}" FontWeight="Normal"/></TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

私が実際に受け取りたかったのは、選択したアイテムをダブルクリックすることです。コマンドを xaml のテキストブロックにバインドできないので (できますか?) MouseLeftButtonDown-Event、. しかし、イベントは決して受け取られません!

C# (コード ビハインド):

private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Console.WriteLine("MouseLeftButtonDown received!");
}

私は何を間違っていますか?どうすればイベントを受け取ることができますか? ところで:コンテキストメニューのコマンドはうまく機能しています:)

更新エラーが見つかりました --> 間違ったユーザー コントロールにイベントを追加しました。いまいましい私の集中力の欠如。皆様お騒がせして申し訳ありません。

4

2 に答える 2

3

ブレンド SDK (System.Windows.Interactivity.dll) から InvokeCommandAction を使用するだけです。

    <ListView x:Name="lvw" ItemsSource="{Binding ListOfOldData}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction  Command="{Binding Path=OpenCommand}" 
                                            CommandParameter="{Binding ElementName=lvw, Path=SelectedItem}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </ListView>

編集: ビューモデルは次のようになります。

    public List<object> ListOfOldData{ get; set; }

    private DelegateCommand<object> _openCommand;//or RelayCommand

    public DelegateCommand<object> OpenCommand
    {
        get { return _openCommand?? (this._openCommand= new DelegateCommand<object>(this.Execute)); }
    }

    private void Execute(object obj)
    {
        //obj is your selectedItem
    }

追伸:あなたのタイプがわからないので、なぜオブジェクトなのか

于 2012-07-05T12:37:24.687 に答える
1

にはListViewDoubleClick MouseEvent があります。これはそれを行う必要があります:

<ListView MouseDoubleClick="DoubleClickOnIt">
   <ListView.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Path=Name}" FontWeight="Bold">
            <TextBlock Text=" - " FontWeight="Normal"/>
            <TextBlock Text="{Binding Path=UpdateDatum}" FontWeight="Normal"/>
         </TextBlock>
      </DataTemplate>
   </ListView.ItemTemplate>

   <ListViewItem>
      dddd
   </ListViewItem>
   <ListViewItem>
      eeeee
   </ListViewItem>
</ListView>

そして背後にあるコード:

private void DoubleClickOnIt(object sender, MouseButtonEventArgs e)
{
   var listView = sender as ListView;
   var selectedItem = listView.SelectedItem;
   Console.WriteLine("received!");
}
于 2012-07-05T12:31:33.800 に答える