我正在学习WPF和MVVM并且遇到一些问题。
我正在使用MVVM Light,我希望在验证后禁用/启用一些按钮,但它不使用这些功能。
ViewModelMain:
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
namespace EF_MVVM_Test
{
public class ViewModelMain : ViewModelBase
{
public RelayCommand AddAuthorCommand { get; private set; }
public RelayCommand DeleteAuthorCommand { get; private set; }
public RelayCommand RefreshCommand { get; private set; }
public RelayCommand SaveCommand { get; private set; }
public ObservableCollection<Author> Authors { get; set; }
private LibraryContext db;
private Author _SelectedAuthor;
public Author SelectedAuthor
{
get { return _SelectedAuthor; }
set { Set("SelectedAuthor", ref _SelectedAuthor, value); }
}
private Author _NewAuthor;
public Author NewAuthor
{
get { return _NewAuthor; }
set { Set("NewAuthor", ref _NewAuthor, value); }
}
public ViewModelMain()
{
db = new LibraryContext();
db.Author.Load();
Authors = db.Author.Local;
AddAuthorCommand = new RelayCommand(ExecuteAddAuthorCommand, CanExecuteAddAuthorCommand);
DeleteAuthorCommand = new RelayCommand(ExecuteDeleteAuthorCommand, CanExecuteDeleteAuthorCommand);
RefreshCommand = new RelayCommand(ExecuteRefreshListCommand);
SaveCommand = new RelayCommand(ExecuteSaveCommand);
NewAuthor = new Author();
}
private void ExecuteAddAuthorCommand()
{
db.Author.Add(_NewAuthor);
NewAuthor = new Author();
}
private void ExecuteDeleteAuthorCommand()
{
db.Author.Remove(SelectedAuthor);
}
private void ExecuteRefreshListCommand()
{
db.Author.Load();
Authors = db.Author.Local;
}
private void ExecuteSaveCommand()
{
db.SaveChanges();
}
private bool CanExecuteAddAuthorCommand()
{
return (!string.IsNullOrEmpty(NewAuthor.Name) && NewAuthor.Birthday != null);
}
private bool CanExecuteDeleteAuthorCommand()
{
return SelectedAuthor != null;
}
}
}
XAML:
<StackPanel>
<DataGrid ItemsSource="{Binding Authors}" SelectedItem="{Binding SelectedAuthor}" AutoGenerateColumns="False" Height="200" Margin="5" CanUserAddRows="False" CanUserDeleteRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Birthday" Binding="{Binding Birthday}"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name" Margin="5" VerticalAlignment="Center"/>
<TextBox Height="25" Width="70" Margin="5" Text="{Binding NewAuthor.Name}"/>
<TextBlock Text="Geburtstag" Margin="5" VerticalAlignment="Center"/>
<DatePicker Height="25" Width="130" Margin="5" SelectedDate="{Binding NewAuthor.Birthday}"/>
<Button Margin="5" Height="25" Width="80" Content="Hinzufügen" HorizontalAlignment="Left" Command="{Binding AddAuthorCommand}"/>
<Button Margin="5" Height="25" Width="80" Content="Löschen" HorizontalAlignment="Left" Command="{Binding DeleteAuthorCommand}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Width="120" Height="25" Content="Speichern" HorizontalAlignment="Left" Margin="5" Command="{Binding SaveCommand}"/>
<!--Button Width="120" Height="25" Content="Aktualisieren" HorizontalAlignment="Left" Margin="5" Command="{Binding RefreshCommand}"/-->
</StackPanel>
</StackPanel>
为什么按钮没有使用canexecute函数的任何想法?
答案 0 :(得分:2)
您的问题是您正在使用的命名空间:
using GalaSoft.MvvmLight.Command;
将其替换为:
using GalaSoft.MvvmLight.CommandWpf;
答案 1 :(得分:0)
WPF的CommandManager在检测到UI更改时调用CanExecute
?什么构成UI变化?添加和删除元素,一些绑定更新,可视状态更改。基本上,只要WPF感觉像它。这是不可靠的。
你怎么穿这个?如果您需要刷新RelayCommand
,请致电RelayCommand.RaiseCanExecuteChanged()
。此方法引发一个事件,通知WPF它应该重新评估命令的状态。
答案 2 :(得分:0)
看起来你几天前和我有同样的问题。
ICommand.CanExecute
没有打电话,因为您当然不会说按钮:&#34;当我在TextBox
&#中插入内容时,按钮点击的功能可能会发生变化34 ;.因此,如果文本框文本发生变化,您的按钮不会意识到他可以启用。您必须明确告诉该按钮,当文本发生更改时,应通过在textbox tex更改时引发ICommand.CanExecute
事件来检查ICommand.CanExecuteChanged
。