1

現在、ICommandを使用してテストを行っていますが、ListBox.ItemTemplateのボタンでICommandが起動しないのはなぜですか。ただし、テンプレートの外部で使用すると機能します。

これがウィンドウxamlです

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.Window2"
        Title="Window2" Height="300" Width="300">
    <Window.DataContext>
        <local:W2VM/>
    </Window.DataContext>

    <Grid>
        <ListBox x:Name="listHistory" BorderThickness="0" Margin="0" Padding="0" HorizontalContentAlignment="Stretch" ItemsSource="{Binding History}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding ''}" />
                        <Button 
                            Grid.Column="1" 
                            HorizontalAlignment="Right" 
                            x:Uid="btnDeleteHistoryItem" 
                            x:Name="btnDeleteHistoryItem" 
                            Content="r" 
                            FontFamily="Marlett" 
                            Visibility="Hidden" Command="{Binding MeClick}" 

                            />
                    </Grid>

                    <DataTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Visibility" TargetName="btnDeleteHistoryItem" Value="Visible" />
                        </Trigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Button Content=" exit " VerticalAlignment="Bottom" Command="{Binding ExitCommand}" />
    </Grid>
</Window>

これが完全なViewModelコードです

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window2.xaml
    /// </summary>
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();
        }
    }

    public class W2VM : ViewModelBase
    {
        public List<string> _History = new List<string>();
        public List<string> History
        {
            get { return this._History; }
        }

        public ICommand MeClick
        {
            get;
            internal set;
        }

        public ICommand ExitCommand
        {
            get;
            internal set;
        }

        public W2VM()
        {
            this.History.AddRange(new string[] {
                "jayson", "hello", "world"
            });

            this.MeClick = new RelayCommand(Test);
            this.ExitCommand = new RelayCommand(Exit);
        }

        void Exit()
        {
            Application.Current.Shutdown();
        }

        void Test()
        {
            Debug.WriteLine("hello world");

            MessageBox.Show("do something incredible");
        }
    }
}

Test()は起動しません


わかりました。動作しました。

<Window.Resources>
    <me:W2VM x:Key="local" />
</Window.Resources>

それ以外の

<Window.DataContext>
    <local:W2VM/>
</Window.DataContext>

と私のウィンドウグリッド

<Grid DataContext="{StaticResource local}">
    <ListBox x:Name="listHistory" BorderThickness="0" Margin="0" Padding="0" HorizontalContentAlignment="Stretch" ItemsSource="{Binding History}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <TextBlock Text="{Binding ''}" />
                    <Button 
                        Grid.Column="1" 
                        HorizontalAlignment="Right" 
                        x:Uid="btnDeleteHistoryItem" 
                        x:Name="btnDeleteHistoryItem" 
                        Content="r" 
                        FontFamily="Marlett" 
                        Visibility="Hidden" Command="{Binding MeClick, Source={StaticResource local}}"  />
                </Grid>

                <DataTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Visibility" TargetName="btnDeleteHistoryItem" Value="Visible" />
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <Button Content=" exit " VerticalAlignment="Bottom" Command="{Binding ExitCommand}" />
</Grid>

今、これは別の問題を提起します。

btnDeleteHistoryItemコマンドがルーティングされたときに、どのListViewItemがクリックされたかをどのように知ることができますか?

4

1 に答える 1

0

mvvm-lightのrelayコマンドを使用していますか?コマンドパラメータを使用して、コマンドメソッドに情報を渡します。

<Button 
                        Grid.Column="1" 
                        HorizontalAlignment="Right" 
                        x:Uid="btnDeleteHistoryItem" 
                        x:Name="btnDeleteHistoryItem" 
                        Content="r" 
                        FontFamily="Marlett" 
                        Visibility="Hidden" Command="{Binding MeClick, Source=StaticResource local}}" 
                        CommandParameter="YourUniqueIdentifyingVariable"  />

次に、ビューモデルで:

public RelayCommand<string> MeClick{
    get { return _MyClick; }
    private set { _MyClick = value; }
}

public New()
{

    MeClick = new RelayCommand<string>(MySub, MySubIsEnabled);
}

private void MySub(string sParam)
{
    //do stuff here, YourUniqueIdentifyingVariable is sParam
}

private bool MySubIsEnabled(string sParam)
{
    return true;
}

「YourUniqueIdentifyingVariable」をレコードのIDまたはコマンドメソッドで処理できるその他の値にバインドできます

コードはテストされていませんが、機能するはずです

于 2013-02-06T16:20:33.690 に答える