绑定命令到 ItemsControl Item
Binding Command to ItemsControl Item
我正在使用 MVVMLight 开发 Win10 UWP 应用程序(我从未使用过 MVVMLight,也从未执行过命令 "properly")。我有一个绑定到 ObservableCollection 的 ItemsControl。 Participant 有两个属性 - Name 和 Laps。我在 ItemsControl.ItemTemplate 中有控件来显示一个按钮(减去)、项目的名称 属性、项目的圈数 属性 和另一个按钮(添加)。这是 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。我已经尝试了很多东西,所以我无法 post 我在这里尝试过的所有东西。这是我拥有的最新版本,(但它仍然不起作用):
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 中的智能感知告诉我它无法在 LapCounter.Model.Participant 类型的数据上下文中解析 属性 AddLapCommand。我不是要访问 Participant class,而是要访问 HomeViewModel class,它是页面的 DataContext。我想我可以看到它从 ItemsControl 绑定到的集合中的单个项目中获取 LapCounter.Model.Participant 的位置。但我的印象是,如果找不到 DataContext,它将继续沿着可视化树向上移动,直到找到正确的为止。这是页面声明中的 DataContext:
DataContext="{Binding Home, Source={StaticResource Locator}}"
如何让它查看 RelayCommand 的 VM?我需要做的是让按钮将它代表的参与者作为参数发送给 RelayCommand,并使用它来增加(在减法按钮的情况下减少)该特定参与者的 Laps 整数。
我很感激能得到的任何帮助。谢谢!
编辑
添加了虚拟机中的参与者 属性 以显示,因为我的视图没有更新。这是参与者属性:
/// <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 迄今为止的帮助!
试试这个:
Command="{Binding Home.AddLapCommand, Source={StaticResource Locator}}"
没什么好解释的,只要你写的都是对的。
至于 incrementing\decrementing 和 Laps
,您可以简单地将 Participant
传递到命令处理程序并更改 Laps
。如果您使用 RelayCommand<Participant>
完成的 MVVMLight。不要忘记在 CommandParameter
.
中传递 Participant
我正在使用 MVVMLight 开发 Win10 UWP 应用程序(我从未使用过 MVVMLight,也从未执行过命令 "properly")。我有一个绑定到 ObservableCollection 的 ItemsControl。 Participant 有两个属性 - Name 和 Laps。我在 ItemsControl.ItemTemplate 中有控件来显示一个按钮(减去)、项目的名称 属性、项目的圈数 属性 和另一个按钮(添加)。这是 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。我已经尝试了很多东西,所以我无法 post 我在这里尝试过的所有东西。这是我拥有的最新版本,(但它仍然不起作用):
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 中的智能感知告诉我它无法在 LapCounter.Model.Participant 类型的数据上下文中解析 属性 AddLapCommand。我不是要访问 Participant class,而是要访问 HomeViewModel class,它是页面的 DataContext。我想我可以看到它从 ItemsControl 绑定到的集合中的单个项目中获取 LapCounter.Model.Participant 的位置。但我的印象是,如果找不到 DataContext,它将继续沿着可视化树向上移动,直到找到正确的为止。这是页面声明中的 DataContext:
DataContext="{Binding Home, Source={StaticResource Locator}}"
如何让它查看 RelayCommand 的 VM?我需要做的是让按钮将它代表的参与者作为参数发送给 RelayCommand,并使用它来增加(在减法按钮的情况下减少)该特定参与者的 Laps 整数。
我很感激能得到的任何帮助。谢谢!
编辑 添加了虚拟机中的参与者 属性 以显示,因为我的视图没有更新。这是参与者属性:
/// <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 迄今为止的帮助!
试试这个:
Command="{Binding Home.AddLapCommand, Source={StaticResource Locator}}"
没什么好解释的,只要你写的都是对的。
至于 incrementing\decrementing 和 Laps
,您可以简单地将 Participant
传递到命令处理程序并更改 Laps
。如果您使用 RelayCommand<Participant>
完成的 MVVMLight。不要忘记在 CommandParameter
.
Participant