我试图将此(从旧应用程序)转换为MVVM模式,但我不知道如何做到这一点。
textBoxLoader.AddHandler(CommandManager.ExecutedEvent, new RoutedEventHandler(PasteFunction), true);
private void PasteFunction(object sender, RoutedEventArgs e)
{
if ((e as ExecutedRoutedEventArgs).Command == ApplicationCommands.Paste)
{
// verify that the textbox handled the paste command
textBoxLoader.IsEnabled = false;
List<string[]> MachineList = new List<string[]>();
List<string> list = new List<string>(Regex.Split(textBoxLoader.Text, Environment.NewLine));
}}
如何从WPF TextBox 粘贴事件重现此命令并调用命令? 我可以成功绑定 Enter Key事件,但如何绑定粘贴事件?
下面是我在新MVVM中绑定 Icommand 的代码片段( Enter Key listener )
<UserControl.InputBindings>
<KeyBinding Key="Enter" Command="{Binding ClickCommand}" CommandParameter="{Binding Text, ElementName=textBoxLoader}"/>
</UserControl.InputBindings>
答案 0 :(得分:2)
在视图中:
<TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="120" Height="200"/>
在视图模型中:
class MainWindowViewModel : BindableBase
{
private string text;
public string Text
{
get { return text; }
set { SetProperty(ref text, value); }
}
}
这样,粘贴文本或按 Ctrl + V 时,Text值会更新并引发PropertyChanged事件。因此,您可以将粘贴的文本识别为文本框。
如果您想出于某些特殊原因识别Ctrl + V,请尝试以下操作:
void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.V)
{
// Your action
}
}
答案 1 :(得分:0)
在MVVM中,文本框绑定到VM上的属性。为什么不简单地订阅VM的通知属性更改(可以在VM本身实际上完成)并查找在该绑定属性上报告的更改。
发送更改通知后,请执行所需的逻辑。
示例强>
这个工作示例不会在现实世界中使用,因为工作将在Name
的设置器中完成,演示如何订阅notify事件。更改Name
后,VM将捕获事件中的更改,并计算FullName
,并从订阅中为FullName
引发更改的属性。
public class ExampleVM : INotifyPropertyChanged
{
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; OnPropertyChanged(); }
}
public string FullName { get; set; }
public ExampleVM()
{
this.PropertyChanged += (s, a) =>
{
if (a.PropertyName == "Name")
{
FullName = $"Mr. {Name}";
OnPropertyChanged("FullName");
}
};
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
使用C#6编码,但可以在任何其他版本的C#中重写。