我正在使用MVVMLight开发一个Win10 UWP应用程序(我从未使用过MVVMLight,从未完成命令"正确")。我有一个ItemsControl绑定到ObservableCollection。参与者有两个属性 - 名称和Laps。我在ItemsControl.ItemTemplate中有控件来显示一个按钮(减去),项目的Name属性,项目的Laps属性和另一个按钮(add)。这是XAML:
<ItemsControl
ItemsSource="{Binding Participants, Mode= TwoWay}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid
MinWidth="300"
Margin="0, 12">
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="2*"></ColumnDefinition>
<ColumnDefinition
Width="6*"></ColumnDefinition>
<ColumnDefinition
Width="2*"></ColumnDefinition>
<ColumnDefinition
Width="3*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button
Content=""
FontFamily="Segoe MDL2 Assets"
FontSize="20"
Grid.Column="0"
Margin="0, 0, 12, 0"></Button>
<TextBlock
Text="{Binding Path=Name, Mode=TwoWay}"
FontSize="20"
FontWeight="Bold"
Grid.Column="1"></TextBlock>
<TextBlock
Text="{Binding Laps, Mode=TwoWay}"
FontSize="20"
FontWeight="Bold"
Grid.Column="2"></TextBlock>
<Button
Content=""
FontFamily="Segoe MDL2 Assets"
FontSize="20"
Command="{Binding AddLapCommand}"
CommandParameter="{Binding}"
Grid.Column="3"
Margin="12, 0, 0, 0"></Button>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
视图模型创建一个名为Participants的ObservableCollection。我试图将添加按钮(当然还有减法按钮)绑定到VM中的RelayCommand。我已经尝试了很多东西,所以我无法发布我在这里试过的所有内容。这是我所拥有的最新内容(但它仍然无效):
public RelayCommand<object> AddLapCommand
{
get
{
if (_addLapCommand == null)
{
_addLapCommand = new RelayCommand<object>((e) => ExecuteAddLapCommand(e));
}
return _addLapCommand;
}
}
private void ExecuteAddLapCommand(object o)
{
throw new NotImplementedException();
}
xaml中的intellisense告诉我它无法在LapCounter.Model.Participant类型的数据上下文中解析属性AddLapCommand。我没有尝试访问Participant类,而是访问HomeViewModel类,它是页面的DataContext。我想我可以从ItemsControl所绑定的集合中的单个项目中看到它从哪里获得LapCounter.Model.Participant。但我的印象是,如果无法找到DataContext,它将继续向上看,直到找到正确的树。这是页面声明中的DataContext:
DataContext="{Binding Home, Source={StaticResource Locator}}"
如何让它查看RelayCommand的VM?我需要做的是让按钮将它所代表的参与者作为参数发送到RelayCommand,并使用它来递增(并在减法按钮的情况下递减)该特定参与者的Laps整数。
我感谢任何帮助。谢谢!
修改 从VM添加了Participants属性以显示,因为我的视图未更新。以下是参与者属性:
/// <summary>
/// The <see cref="Participants" /> property's name.
/// </summary>
public const string ParticipantsPropertyName = "Participants";
private ObservableCollection<Participant> _participants = new ObservableCollection<Participant>();
/// <summary>
/// Sets and gets the Participants property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public ObservableCollection<Participant> Participants
{
get
{
return _participants;
}
set
{
if (_participants == value)
{
return;
}
_participants = value;
RaisePropertyChanged(() => Participants);
}
}
感谢Eldar Dordzhiev到目前为止的帮助!
答案 0 :(得分:1)
试试这个:
Command="{Binding Home.AddLapCommand, Source={StaticResource Locator}}"
只要您撰写的所有内容绝对正确,就没有太多要向您解释。
至于递增\递减Laps
,你可以简单地将Participant
传递给命令处理程序并改变Laps
。如果您使用RelayCommand<Participant>
完成的MVVMLight。不要忘记通过Participant
中的CommandParameter
。