ListViewItem内的按钮不会调用有界命令

时间:2017-03-02 05:46:35

标签: c# listview data-binding uwp command

我使用ListView来显示我的数据列表。

我想为每个ListViewItem添加一个删除按钮,因此当用户单击该按钮时,相应的ListViewItem将从列表中删除。

首先,我尝试使用按钮的点击事件,它就像一个魅力。

但是在我将其重构为命令之后,它就不再起作用了。

我在VS中设置了几个断点,并确保在ViewModel的构造函数中创建了命令。

但是单击按钮不会执行RelayCommand.Execute()方法。

我怀疑这个问题与Command的DataBinding有关 但我不知道如何调查。

感谢您的帮助

这是我的ListView和DataTemplate。

val dataCount = data.count
val numPartitions = math.ceil(dataCount.toDouble/100000).toInt
val newData = data.coalesce(numPartitions)
newData.saveAsTextFile("output path")

这是我的ViewModel

<ListView Name="SavedLoginDatas" ItemsSource="{x:Bind VM.SavedLogins,Mode=OneWay}" 
                      SelectionMode="None"
                      IsItemClickEnabled="False"

                      >
<ListView.ItemTemplate>
    <DataTemplate x:DataType="model:LoginData">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock Margin="15,0" TextTrimming="CharacterEllipsis" Text="{x:Bind VM.CurrentLoginVM.Data.UserName,Mode=TwoWay}"/>
            <Button Grid.Column="1" Height="48" Width="48" Content="Delete"
                Name="Delete"  Command="{Binding ElementName=VM,Path=RemoveSavedLoginCommand,Mode=OneWay}"  CommandParameter="{Binding DataContext,RelativeSource = {RelativeSource Self}}"
                ></Button>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

这里是RelayCommand Implemention

public class LoginVM : VMBase
{
    private ObservableCollection<LoginData> _savedLogins;


    public ObservableCollection<LoginData> SavedLogins
    {
        get { return _savedLogins; }
        set { _savedLogins = value; }
    }

    public RelayCommand<LoginData> RemoveSavedLoginCommand { get; set; }

    public LoginVM()
    {
        SavedLogins = new ObservableCollection<LoginData>(LoginDataManager.GetLoginDataList());

        UpdateSavedLogin();
        RemoveSavedLoginCommand = new RelayCommand<LoginData>(
            (data) =>
            {
                LoginDataManager.RemoveLoginData(data);
                UpdateSavedLogin();
            },
            ()=>true
        );
    }

    private void UpdateSavedLogin()
    {
        SavedLogins.Clear();
        SavedLogins.AddRange(LoginDataManager.GetLoginDataList());
    }

}

1 个答案:

答案 0 :(得分:0)

Button的Command属性的绑定不正确。 VM是当前页面的属性之一,它不是元素。您可以这样更改:

<Page x:Name="page"  ... />
<Button Command="{Binding ElementName=page,Path=VM.RemoveSavedLoginCommand,Mode=OneWay}" ... />