Как добавить функцию в CheckBox в UserControl - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть usercontrol, который представляет собой раскрывающийся список с флажками.Существует событие щелчка флажка, которое вызывает функцию SetText, которая устанавливает текст на основе того, что было выбрано (которое я хочу сохранить).Я также хотел бы добавить функцию в usercontrol, возможно, через команду, которая устанавливает пользовательскую функцию.Например, когда они устанавливают флажок, я могу вызвать функцию, заданную в viewmodel, а также сохранить функцию SetText.

Я попытался добавить команду к флажку.А также свойство зависимости от usecontrol для Команды.Кроме того, простая функция для использования в viewmodel

-UserControl.xaml

 <ComboBox
    x:Name="CheckableCombo"
    SnapsToDevicePixels="True"
    OverridesDefaultStyle="True"
    ScrollViewer.HorizontalScrollBarVisibility="Auto"
    ScrollViewer.VerticalScrollBarVisibility="Auto"
    ScrollViewer.CanContentScroll="True"
    IsSynchronizedWithCurrentItem="True"
    MinWidth="120"
    MinHeight="20"
    ItemsSource="{Binding ElementName=UserControl, Path=ItemsSource}"
    DataContext="{Binding ElementName=UserControl, Path=DataContext}"
    >
    <ComboBox.ItemTemplate>
        <HierarchicalDataTemplate>
            <CheckBox Content="{Binding Title}"
                      IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"
                      Tag="{RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}"
                      Click="CheckBox_Click"
                      Command="{Binding YourCommand}"

              />
   <i:Interaction.Triggers>
       <i:EventTrigger EventName="SelectionChanged">
         <i:InvokeCommandAction Command="{Binding YourCommand}" />
      </i:EventTrigger>
     </i:Interaction.Triggers>

-UserControl.xaml.cs

    public ICommand YourCommand
    {
        get { return (ICommand)GetValue(YourCommandProperty); }
        set { SetValue(YourCommandProperty, value); }
    }

    // Using a DependencyProperty as the backing store for YourCommand.  This enables animation, styling, binding, etc...
    //public static readonly DependencyProperty YourCommandProperty =
    //    DependencyProperty.Register("YourCommand", typeof(ICommand), typeof(ComboWithCheckboxes), new PropertyMetadata(0));
    public static readonly DependencyProperty YourCommandProperty =
        DependencyProperty.Register("YourCommand", typeof(ICommand), typeof(ComboWithCheckboxes));

    #endregion

    public ComboWithCheckboxes()
    {
        InitializeComponent();
    }

    /// <summary>
    ///Whenever a CheckBox is checked, change the text displayed
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void CheckBox_Click(object sender, RoutedEventArgs e)
    {
        SetText();
    }

    /// <summary>
    ///Set the text property of this control (bound to the ContentPresenter of the ComboBox)
    /// </summary>
    private void SetText()
    {
        this.Text = (this.ItemsSource != null) ?
            this.ItemsSource.ToString() : this.DefaultText;
        // set DefaultText if nothing else selected
        if (string.IsNullOrEmpty(this.Text))
        {
            this.Text = this.DefaultText;
        }
    }

}

-ViewModel.cs

  public ViewModel()
    {
        ViewModelCommand = new DelegateCommand(MethodTest, canExecuteTest);

        itemSource = new ObservableNodeList();
        Node a = new Node("English");
        a.IsSelected = true;
        itemSource.Add(a);

        Node b = new Node("Hebrew");
        b.IsSelected = false;
        itemSource.Add(b);

        Node c = new Node("Swedish");
        c.IsSelected = false;
        itemSource.Add(c);

        Node d = new Node("German");
        d.IsSelected = false;
        itemSource.Add(d);
    }

    private bool canExecuteTest(object obj)
    {
        return true;
    }

    private void MethodTest(object obj)
    {
        System.Windows.MessageBox.Show("Test Method");
    }

Мой ожидаемый результат состоял в том, что я мог попасть в командную функцию, когда устанавливал или снимал флажки

1 Ответ

0 голосов
/ 24 апреля 2019

Я упрощаю ваш пользовательский контроль, чтобы сделать его более читабельным и сосредоточиться только на работе external-command. Я изменяю привязку команды. В списке вы получили локальный контекст данных элемента, но он необходим для привязки команды к контексту внешних данных.

 <ComboBox ItemsSource="{Binding ElementName=UserControl, Path=ItemsSource}">
      <ComboBox.ItemTemplate>
          <HierarchicalDataTemplate>
               <CheckBox Content="{Binding .}"
                   Click="CheckBox_Click"
                   Command="{Binding ElementName=UserControl,Path=YourCommand}"> 
                </CheckBox>
          </HierarchicalDataTemplate>
       </ComboBox.ItemTemplate>
 </ComboBox>

В UserControl1.cs я получил:

public ICommand YourCommand
{
    get { return (ICommand)GetValue(YourCommandProperty); }
    set { SetValue(YourCommandProperty, value); }
}

// Using a DependencyProperty as the backing store for YourCommand.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty YourCommandProperty =
            DependencyProperty.Register("YourCommand", typeof(ICommand), typeof(UserControl1), new PropertyMetadata(null));

Я проверил, и это работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...