我正在学习MVVM和WPF.xaml我的项目中有一个文件,后面的代码中有一个简单的单击事件处理程序.
现在我想在MVVM中做同样的事情.我阅读了很多文章,并在沙发上阅读了很多答案.但仍然无法做到这一点.
任何人都可以举一个简单的例子,在MVVM中完成一个按钮点击事件.
编辑
<Window x:Class="WhiteBalance.BaseCalWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:NumberUpDownControl;assembly=NumberUpDownControl"
xmlns:viewn="clr-namespace:WhiteBalance.ViewModels"
Title="RefImgSettingWindow" Height="900" Width="1000" ResizeMode="NoResize"
BorderThickness="4">
<Window.Resources>
<viewn:DashBoardViewModel x:Key="demokey"></viewn:DashBoardViewModel>
</Window.Resources>
<Grid x:Name="gdParent" DataContext="{StaticResource demokey}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="490" />
<ColumnDefinition Width="488*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="300" />
<RowDefinition Height="300" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0">
<Label Content="{Binding Path=NAME,Mode=TwoWay}" Height="28" Name="lblTest" />
<Button Content="Capture" Height="23" Name="btnCapture" Width="75" Command="{Binding Path=SaveCommand}"
Canvas.Left="94" Canvas.Top="254" />
</StackPanel>
</Grid>
</Window>
namespace WhiteBalance.ViewModels
{
public class DashBoardViewModel: ObservableObject
{
private string _name = "dsqdasd";
public string NAME
{
get { return _name; }
set { _name = value; }
}
public ICommand SaveCommand
{
get;
set;
}
private bool CanExecuteSaveCommand()
{
return true; // !string.IsNullOrEmpty(LastName);
}
private void CreateSaveCommand()
{
SaveCommand = new RelayCommand(SaveExecute, CanExecuteSaveCommand);
}
public void SaveExecute()
{
//Person.Save(_newPerson);
NAME = "Changed Name";
}
public DashBoardViewModel()
{
//objModel.TestText = "This will change";
NAME = "TestName";
}
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
slu*_*ter 25
您可以将按钮的Command属性绑定到任何返回ICommand的属性.Prism实现了一个非常方便的命令,名为DelegateCommand,它非常容易使用(这里是一个很好的解决方案):
public ICommand MyButtonClickCommand
{
get { return new DelegateCommand<object>(FuncToCall, FuncToEvaluate); }
}
private void FuncToCall(object context)
{
//this is called when the button is clicked
}
private bool FuncToEvaluate(object context)
{
//this is called to evaluate whether FuncToCall can be called
//for example you can return true or false based on some validation logic
return true;
}
<Button x:Name="myButton" Command="{Binding MyButtonClickCommand}" />
Run Code Online (Sandbox Code Playgroud)
CodeProject示例如何在WPF中使用命令有一个非常类似的示例,代码可以轻松完成.以前的Stack Overflow问题有一个使用静态绑定到的RoutedCommands的示例:如何将Close命令绑定到按钮,以及如何将WPF按钮绑定到ViewModelBase中的命令?有一个稍微高级的例子.
小智 5
看到很多实现这个 ICommand 接口的答案,我建议一个更简单的选择,那就是使用内置的 System.Windows.Input
下面是一个例子:
Xaml 视图:
<Window
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"
x:Class="SomeDialog"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterOwner"
ResizeMode="CanResizeWithGrip">
<StackPanel>
<Button Width="Auto" Command="{Binding ClearCommand}" Content="Clear"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
查看后面的代码:
using System.Windows;
public partial class SomeDialog : Window
{
public SomeDialog()
{
var vm = new ViewModel();
DataContext = vm;
CommandBindings.AddRange(vm.Commands);
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
查看型号:
using System.Windows.Input;
public class ViewModel : ViewModelBase
{
readonly CommandBindingCollection commands = new CommandBindingCollection();
public static RoutedUICommand ClearCommand { get; set; } = new RoutedUICommand("Clear", "ClearCommand", typeof(ErrorDialog));
public CommandBindingCollection Commands
{
get
{
commands.Add(new CommandBinding(ClearCommand, OnClearExecuted);
return commands;
}
}
void OnClearExecuted(object sender, ExecutedRoutedEventArgs e)
{
view.DialogResult = true; //Indicate things
view.Close(); //Close the window
}
}
Run Code Online (Sandbox Code Playgroud)
像这样调用:
public void OpenSomeDialog()
{
var dialog = new SomeDialog() {Owner = Application.Current.MainWindow};
bool? b = dialog.ShowDialog();
if (b != null && (bool) b)
//Do things
}
Run Code Online (Sandbox Code Playgroud)
现在去对话的东西。
| 归档时间: |
|
| 查看次数: |
52273 次 |
| 最近记录: |