能请你帮我吗?
我有一个复选框和一个文本块。
<checkbox ..... />
<textblock ..... />
它们用于记住密码。
如何做到这一点,以便当我单击文本块时,该复选框会更改其状态。
我无法破坏mvvm模式的结构。
答案 0 :(得分:1)
最简单的方法
<CheckBox>
<TextBlock Text="Your text here"/>
</CheckBox>
更新 您应该使用MVVM。 没有mvvm框架,将是这样。
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
...
<StackPanel>
<CheckBox Name="CheckBox" IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
<TextBlock Text="Your text here">
<TextBlock.InputBindings>
<MouseBinding Command="{Binding IsCheckedCommand}" MouseAction="LeftClick" />
</TextBlock.InputBindings>
</TextBlock>
</StackPanel>
后面的代码
public class RelayCommand : ICommand
{
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
public RelayCommand(Action<object> execute) : this(execute, null) { }
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute;
}
[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
return _canExecute?.Invoke(parameter) ?? true;
}
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
public void Execute(object parameter) { _execute(parameter); }
}
public class ViewModel:INotifyPropertyChanged
{
public bool IsChecked { get; set; }
public RelayCommand IsCheckedCommand { get; set; }
public ViewModel()
{
IsCheckedCommand = new RelayCommand(m => IsCheckedCommandExecute());
}
private void IsCheckedCommandExecute()
{
IsChecked = !IsChecked;
OnPropertyChanged(nameof(IsChecked));
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
https://msdn.microsoft.com/en-us/magazine/dd419663.aspx
如果您不想创建ICommand和INotifyPropertyChanged的自定义实现,则可以使用mvvm框架,例如MvvmLight