C#:WPF MVVM中的按钮绑定

Ind*_*ica 1 c# wpf mvvm

所以我有一个ItemsControl的视图,它绑定到一些ObservableCollection.在DataTemplate中,我需要两个按钮.当我尝试将这些按钮绑定到我定义它们的位置时,我启动应用程序,按钮单击时没有任何反应.

风景:

<UserControl x:Class="GraphicalUserInterface.Views._2_ToDoList.ToDoListMainView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:GraphicalUserInterface.Views._2_ToDoList"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="600"
         DataContext="{Binding Source={StaticResource Locator}, Path=ToDoListMain}">
<Grid>
    <ItemsControl Margin="5" ItemsSource="{Binding ListEntries}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border CornerRadius="5" BorderThickness="2" BorderBrush="Black" Height="50" Margin="5">
                    <StackPanel Orientation="Horizontal" Margin="0,5">
                        <Label FontWeight="Bold">Customer:</Label>
                        <Label Content="{Binding Customer}" Margin="0,0,20,0"/>
                        <Label FontWeight="Bold">Trainer:</Label>
                        <Label Content="{Binding Trainer}" Margin="0,0,20,0"/>
                        <Label FontWeight="Bold">Date:</Label>
                        <Label Content="{Binding Date}" Margin="0,0,20,0"/>
                        <Label FontWeight="Bold">RequestType:</Label>
                        <Label Content="{Binding RequestType}" Margin="0,0,20,0"/>
                        <Button Margin="5" Width="100" CommandParameter="{Binding}" Command="{Binding Path=DataContext.ContactBtnClickCommand, RelativeSource= {RelativeSource FindAncestor,AncestorType={x:Type ItemsControl}}}">Contact</Button>
                        <Button Margin="5" Width="100" CommandParameter="{Binding}" Command="{Binding DataContext.AcceptBtnClickCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}">Accept</Button>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)

班级:

public class ToDoListMainVM : ViewModelBase
{
    private ObservableCollection<ToDoVM> listEntries;
    public ObservableCollection<ToDoVM> ListEntries
    {
        get { return listEntries; }
        set
        {
            listEntries = value;
            RaisePropertyChanged();
        }
    }

    SelectHandler selectHandler = new SelectHandler();
    InsertHandler insertHandler = new InsertHandler();
    DeleteHandler deleteHandler = new DeleteHandler();

    NavigationService navService = new NavigationService();

    public RelayCommand<ToDoVM> AcceptBtnClickCommand;
    public RelayCommand<ToDoVM> ContactBtnClickCommand;

    public ToDoListMainVM()
    {
        UpdateToDoList();

        AcceptBtnClickCommand = new RelayCommand<ToDoVM>((p) =>
        {
            //Enter into database
            insertHandler.InsertAppointmentToDatabase(new AppointmentVM()
            {
                Customer = p.Customer,
                Date = p.Date,
                Trainer = p.Trainer
            });
            //Make it instantly visible in the Calender
            Messenger.Default.Send<NewAppointmentMessage>(new NewAppointmentMessage(p.Customer, p.Date));

            //Delete from ToDo (View)
            ListEntries.Remove(p);

            //Delete from Db
            deleteHandler.DeleteToDo(p);

            //Set view to Calender
            navService.NavigateTo("MyTrainingsMain");

        });
Run Code Online (Sandbox Code Playgroud)

查看型号:

public class ToDoVM
{
    public int ToDoVMID { get; set; }
    public string RequestType { get; set; }
    public DateTime Date { get; set; }
    public CustomerVM Customer { get; set; }
    public TrainerVM Trainer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

15e*_*153 6

命令属性需要是带有getter的属性.您无法绑定到字段.

    public RelayCommand<ToDoVM> AcceptBtnClickCommand { get; private set; }
    public RelayCommand<ToDoVM> ContactBtnClickCommand  { get; private set; }
Run Code Online (Sandbox Code Playgroud)

你的其余代码很好.绑定是正确的.您可以稍微简化它们,但它们的工作方式与您编写它们的方式完美相同.

Command="{Binding DataContext.ContactBtnClickCommand, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
Run Code Online (Sandbox Code Playgroud)