확인란에서 명령을 실행하고 있습니다.선택됨 또는 선택되지 않음
창에 확인란 컨트롤이 있습니다.연관된 뷰 모델에서 메서드를 호출하는 명령을 실행하고 싶습니다.저는 또한 확인란의 값이 필요합니다.명령을 확인란과 연결할 방법을 찾을 수 없습니다.이런 일을 한 사람이 있습니까?
<CheckBox Content="CheckBox"
Command="{Binding YourCommand}"
CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}" />
MVVM을 사용하는 경우 다음과 같은 이벤트 트리거를 사용할 수 있습니다.
<CheckBox IsChecked="{Binding ServiceOrderItemTask.IsCompleted, Mode=TwoWay}" Content="{Binding ServiceOption.Name}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding DataContext.IsCompletedCheckedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type t:RadGridView}}}" CommandParameter="{Binding}"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction Command="{Binding DataContext.IsCompletedUncheckedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type t:RadGridView}}}" CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
이것은 당신이 요구하는 대로 작동할 것입니다.
<CheckBox CommandParameter="{Binding}"
Command="{Binding DataContext.AddRemovePresetAssignmentCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}}"
Content="{Binding Path=Name}">
- 더하다
System.Windows.Interactivity
프로젝트 참조를 참조하십시오. - 더하다
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
XAML 네임스페이스로 이동합니다.
<CheckBox IsChecked="{Binding SomeBoolProperty, Mode=OneWay}" Content="Check Meee!">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding MyOnCheckedCommand}"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction Command="{Binding MyOnUncheckedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
는 현을 구현합니다.INotifyPropertyChanged
My View됩니다.
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
그SomeBoolProperty
그러면 내 View Model은 다음과 같이 표시됩니다.
private bool _SomeBoolProperty = false;
public bool SomeBoolProperty {
get => _SomeBoolProperty;
set {
_SomeBoolProperty = value;
OnPropertyChanged(nameof(SomeBoolProperty));
}
}
저는 여기 https://stackoverflow.com/a/22286816/336753 에서 RelayCommand를 명령 구현으로 사용합니다.
그러면 내 View Model의 명령은 다음과 같습니다.
public ICommand MyOnCheckedCommand { get; } = new RelayCommand(o => {
// Do something here.
SomeBoolProperty = true;
});
public ICommand MyOnUncheckedCommand { get; } = new RelayCommand(o => {
// Do something else here.
SomeBoolProperty = false;
});
View Model에서 이미 가지고 있던 두 개의 명령을 다시 사용하는 방법을 찾으려고 이 질문에 도달했습니다.하나는 선택하면 호출되고 하나는 선택하지 않으면 호출됩니다.일부 버튼에도 사용하기 때문에 매개 변수화된 명령을 추가하고 싶지 않았습니다.여기서 View Model 구현에 대한 질문을 받고 Igor_S의 답변을 완료하기 위해 이 답변을 추가했습니다.도움이 되길 바랍니다.
늦었어요...Rohit Vats answer를 사용하여 이 코드를 만들었습니다.
예제는 작업 코드 추출이며 모든 측면을 이해하는 데 도움이 될 뿐입니다.활성화되거나 비활성화될 수 있는 푸시핀이며 Delegate Command를 사용합니다.릴레이 명령이나 다른 유사한 클래스를 사용하여 동일한 작업을 수행할 수도 있습니다.
명령:
using System.Windows.Input;
namespace HQ.Wpf.Util.Command
{
public class StandardCommand
{
public static RoutedUICommand PinPropertyGrid = new RoutedUICommand("Pin property grid", "PinPropertyGrid", typeof(StandardCommand));
Xaml:
<CheckBox HorizontalAlignment="Right"
VerticalAlignment="Top"
Margin="2,0,3,0"
Command="{Binding CommandPinPropertyGrid}"
CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}">
<CheckBox.Template>
<ControlTemplate TargetType="{x:Type CheckBox}">
<Grid>
<Image x:Name="ImagePushpin" Width="16" Height="16" Source="pack://application:,,,/WpfUtil;component/Images/PushpinUnpinned16x16.png" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="ImagePushpin" Property="Source" Value="pack://application:,,,/WpfUtil;component/Images/PushpinPinned16x16.png" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
모델:
public MainWindowViewModel()
{
CommandPinPropertyGrid = new DelegateCommand<bool>(PinPropertyGrid);
...
// ******************************************************************
public DelegateCommand<bool> CommandPinPropertyGrid { get; private set; }
public void PinPropertyGrid(bool pinned)
{
this.IsPropertyGridPinned = pinned;
}
위임 명령:
using System;
using System.Windows.Input;
namespace HQ.Wpf.Util.Command
{
/// <summary>
/// Represents a command that forwards the <c>Execute</c> and <c>CanExecute</c> calls to specified delegates.
/// </summary>
public class DelegateCommand<T> : ICommand
{
private readonly Action<T> _executeCallback;
private readonly Predicate<T> _canExecuteCallback;
/////////////////////////////////////////////////////////////////////////////////////////////////////
// OBJECT
/////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a new instance of the <see cref="DelegateCommand<T>"/> class.
/// </summary>
/// <param name="executeCallback">The execute callback delegate.</param>
public DelegateCommand(Action<T> executeCallback)
: this(executeCallback, null)
{
// No-op
}
/// <summary>
/// Initializes a new instance of the <see cref="DelegateCommand<T>"/> class.
/// </summary>
/// <param name="executeCallback">The execute callback delegate.</param>
/// <param name="canExecuteCallback">The can execute callback delegate.</param>
public DelegateCommand(Action<T> executeCallback, Predicate<T> canExecuteCallback)
{
if (executeCallback == null)
throw new ArgumentNullException("executeCallback");
this._executeCallback = executeCallback;
this._canExecuteCallback = canExecuteCallback;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
// INTERFACE IMPLEMENTATION
/////////////////////////////////////////////////////////////////////////////////////////////////////
#region ICommand Members
/// <summary>
/// Defines the method that determines whether the command can execute in its current state.
/// </summary>
/// <param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to <see langword="null"/>.</param>
/// <returns>
/// <c>true</c> if this command can be executed; otherwise, <c>false</c>.
/// </returns>
public bool CanExecute(object parameter)
{
return (this._canExecuteCallback == null) ? true : this._canExecuteCallback((T)parameter);
}
/// <summary>
/// Occurs when changes occur that affect whether or not the command should execute.
/// </summary>
public event EventHandler CanExecuteChanged
{
add
{
if (this._canExecuteCallback != null)
CommandManager.RequerySuggested += value;
}
remove
{
if (this._canExecuteCallback != null)
CommandManager.RequerySuggested -= value;
}
}
/// <summary>
/// Defines the method to be called when the command is invoked.
/// </summary>
/// <param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to <see langword="null"/>.</param>
public void Execute(object parameter)
{
this._executeCallback((T)parameter);
}
#endregion // ICommand Members
}
}
확인란의 상태(선택됨 또는 선택 취소됨)만 필요한 경우에는 매개 변수가 필요하지 않습니다.다음 코드를 사용할 때 확인란의 상태를 검색할 수 있습니다.
CheckBox box = e.OriginalSource as CheckBox;
if(box.IsChecked.Value)
DoThis();
else
DoAnotherMethod();
"e"는 명령의 ExecutedRoutedEventArgs-Parameter입니다.상자가 필요합니다.선택됨.값, 상자 때문입니다.Checked is from Type bool?
언급URL : https://stackoverflow.com/questions/5566050/executing-a-command-on-checkbox-checked-or-unchecked
'programing' 카테고리의 다른 글
kubernetes에서 배포/이미지를 삭제하는 방법 (0) | 2023.04.28 |
---|---|
데이터베이스를 계속 연결할 때 오류 발생 (0) | 2023.04.28 |
파이프 ' '을(를) 찾을 수 없습니다. 각도2 사용자 지정 파이프 (0) | 2023.04.28 |
SQL - varchar 데이터 유형을 datetime 데이터 유형으로 변환하여 값이 범위를 벗어났습니다. (0) | 2023.04.28 |
16진수 색상 값에서 솔리드 색상 브러시 만들기 (0) | 2023.04.28 |