单击哪个按钮DataTemplate WPF MVVM

时间:2016-09-14 11:04:11

标签: c# wpf mvvm

我的问题是如何知道点击了哪个按钮。我的按钮绑定到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>

2 个答案:

答案 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