WPF: свяжите мой CheckBox с моим чистым XAML - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь привязать мой CheckBox к моему commnd.

Модель базового вида

public ViewModelBase()
{
    SelectedFileCommand = new SelectedFileCommand(this);
}

<Page.DataContext>
        <viewmodel:ViewModelBase/>
</Page.DataContext>

Команда

public class SelectedFileCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        public ViewModelBase ViewModel { get; set; }

        public SelectedFileCommand(ViewModelBase viewModel)
        {
            ViewModel = viewModel;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {

        }
    }
}

Мой CheckBox

<CheckBox IsChecked="{Binding IsSelected}"              
           <i:Interaction.Triggers>
                 <i:EventTrigger EventName="Checked">
                        <i:InvokeCommandAction Command="{Binding SelectedFileCommand}" CommandParameter="{Binding}"/>
                 </i:EventTrigger>
           </i:Interaction.Triggers>
</CheckBox>

Я также попробую:

<CheckBox DataContext="{Binding}"                                                      
          <i:Interaction.Triggers>
               <i:EventTrigger EventName="IsChecked">
                       <i:InvokeCommandAction Command="{Binding SelectedFileCommand}"
                                              CommandParameter="CheckBox.IsChecked"/>
                </i:EventTrigger>
         </i:Interaction.Triggers>

Но моя Execute функция незвонил.

РЕДАКТИРОВАТЬ

Я забыл упомянуть, что это CheckBox находится внутри ListViewItem

Рабочий раствор

<CheckBox IsChecked="{Binding IsSelected}"
          Command="{Binding DataContext.CheckBoxSelectedFileCommand, ElementName=mainView}"
          CommandParameter="{Binding IsChecked}"/>

1 Ответ

0 голосов
/ 09 февраля 2019

Если этот флажок установлен в виде списка, когда вы говорите Command = "{Binding SelectedFileCommand}", вы будете привязываться к текстовому элементу элемента списка просмотра.Если ваша команда находится в viewmodel вашего окна, это не будет работать.Нечто подобное будет привязано к команде, которая находится в вашей главной модели представления.

Command="{Binding DataContext.SelectedFileCommand, ElementName=mainView}"

Здесь я дал окно x: Name = mainView.Таким образом, я могу привязать к свойствам его dataContext.

И, IsChecked - это не событие, которое вы должны использовать «Проверено».

Последнее, проблема с параметром команды.Поскольку для флажка есть два разных события (Checked / Unchecked), вы можете использовать две команды и не передавать никаких параметров.Или вы можете поместить свойство в viewmodel элемента списка, например;

public bool IsChecked { get; set; }

, и вы можете привязать свойство IsChecked вашего флажка к этому свойству.И, наконец, вы можете привязать параметр команды к этому новому свойству.

Редактировать: Полный пример

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        x:Name="mainView"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ListView ItemsSource="{Binding Items}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Text}" IsChecked="{Binding IsChecked}">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Checked">
                                <i:InvokeCommandAction Command="{Binding DataContext.SelectedFileCommand, ElementName=mainView}"
                                              CommandParameter="{Binding IsChecked}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </CheckBox>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Window>

Код позади:

using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainViewModel();
        }
    }

    public class MainViewModel
    {
        public ObservableCollection<ItemViewModel> Items { get; set; } = new ObservableCollection<ItemViewModel>();
        public ICommand SelectedFileCommand { get; set; }
        public MainViewModel()
        {
            SelectedFileCommand = new SelectedFileCommand(this);
            this.Items.Add(new ItemViewModel() { Text = "Item 1" });
            this.Items.Add(new ItemViewModel() { Text = "Item 2" });
            this.Items.Add(new ItemViewModel() { Text = "Item 3" });
            this.Items.Add(new ItemViewModel() { Text = "Item 4" });

        }
    }

    public class ItemViewModel
    {
        public string Text { get; set; }

        public bool IsChecked { get; set; }
    }

    public class SelectedFileCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        public MainViewModel ViewModel { get; set; }

        public SelectedFileCommand(MainViewModel viewModel)
        {
            ViewModel = viewModel;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            var x = parameter;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...