我使用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());
}
}
答案 0 :(得分:0)
Button的Command属性的绑定不正确。 VM是当前页面的属性之一,它不是元素。您可以这样更改:
<Page x:Name="page" ... />
<Button Command="{Binding ElementName=page,Path=VM.RemoveSavedLoginCommand,Mode=OneWay}" ... />