我的问题是如何知道点击了哪个按钮。我的按钮绑定到ObservableCollection类型的属性,它包含Item类型的对象,当单击一个按钮时,我需要在ViewModel中使用该对象。任何想法如何知道点击了哪个按钮?我没有什么想法,比如发送多个命令参数(ListBox中的1.SelectedItems 2.按钮中的Object)或者在点击按钮后将对象从按钮绑定到ViewModel中Item类型的另一个属性以便使用它。任何想法都会被贬低。
我有按钮的DataTemplate
<DataTemplate x:Key="ButtonTemplate">
<WrapPanel>
<Button x:Name="OrderButton"
FontSize="10"
Height="80" Width="80"
Content="{Binding Name}"
Command="{Binding OrderCommand,
Source={StaticResource OrderViewModel}}"
CommandParameter="{Binding ElementName=ListBoxUserControl, Path=SelectedItems}">
</Button>
</WrapPanel>
</DataTemplate>
我的ViewModel
public class OrderViewModel : ObservableCollection<Order>, INotifyPropertyChanged
{
public CreateOrderCommand CreateOrderCommand { get; set; }
public ObservableCollection<Item> Data { get; set; }
public OrderViewModel()
{
this.CreateOrderCommand = new CreateOrderCommand(this);
DataObservableCollection data= new DataObservableCollection();
Data = data;
}
}
我按照这样填充我的按钮
<WrapPanel x:Name="OrderButtons">
<ItemsControl ItemTemplate="{StaticResource ButtonTemplate}"
ItemsSource="{Binding Data, Source={StaticResource OrderViewModel}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal">
</WrapPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</WrapPanel>
答案 0 :(得分:1)
如果您希望按钮的数据上下文(即项目源中的项目)作为命令参数,则只需将Button.CommandParameter绑定更改为CommandParamter="{Binding}"
,或者
CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
如果您想要点击的实际按钮。
答案 1 :(得分:1)
首先使用CommandParameter发送Button DataContext。要发送列表框的SelectedItem,您可以使用
<Listbox SelectedItem="{Binding SelectedItem}"/>
在列表框中并在ViewModel中创建SelectedItem属性。
private YourItemObject mySelectedItem;
public YourItemObject SelectedItem
{
get { return mySelectedItem; }
set
{
value = mySelectedItem
}
现在,当Button获得clicket时,您可以在ViewModel中使用SelectedItem。如果你有多个选择,它会变得有点棘手;)。
private ButtonClicked(Parameter object)
{
SelectedItem.UsingIt();
if(object is YourButtonDataContext){
YourButtonDataContext.UsingIt();
}
}
使用MultiSelection更新:
使用Multiselection,您必须自己创建列表框。
public class CustomListBox : ListBox
{
public CustomListBox()
{
this.SelectionChanged += CustomListBox_SelectionChanged;
}
void CustomListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.SelectedItemsList = this.SelectedItems;
}
#region SelectedItemsList
public IList SelectedItemsList
{
get { return (IList)GetValue(SelectedItemsListProperty); }
set { SetValue(SelectedItemsListProperty, value); }
}
public static readonly DependencyProperty SelectedItemsListProperty =
DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(CustomListBox), new PropertyMetadata(null));
#endregion
}
在ViewModel中,您必须拥有SelectedItems的属性。
private IList mySelectedData = new List<SelectedDataObject>();
public IList SelectedData
{
get { return mySelectedData ; }
set
{
if (mySelectedData != value)
{
mySelectedData = value;
RaisePropertyChanged(() => SelectedData);
}
}
}
XAML看起来像这样:
<local:CustomListBox ItemsSource="{Binding YourList}" SelectionMode="Extended" SelectedItemsList="{Binding SelectedData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
...
</local:CustomListBox>
DataGrid中多重选择的来源是:https://stackoverflow.com/a/22908694/3330227