我为您构建了一个简单的TestClass:
以下类(class):
public abstract class Person : INotifyPropertyChanged
public class Adult : Person
public class Child : Person
我将此数据存储在
ObservableCollection<Person>
中,并希望在我的Window中显示它:<ListView ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}" Grid.Column="0">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock>
<Run Text="{Binding FirstName}"/>
<Run Text="{Binding LastName}"/>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
所选的我以
ContentPresenter
显示:<ContentPresenter Content="{Binding SelectedPerson}">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type local:Adult}">
<StackPanel>
<TextBlock Text="First Name:"/>
<TextBox>
<TextBox.Text>
<Binding Path="FirstName">
<Binding.ValidationRules>
<local:NotEmptyRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock Text="Last Name:"/>
<TextBox Text="{Binding LastName}"/> <!-- Validation same as FirstName -->
<TextBlock Text="Company:"/>
<TextBox Text="{Binding Company}"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Child}">
<StackPanel>
<TextBlock Text="First Name:"/>
<TextBox Text="{Binding FirstName}"/> <!-- Validation same as above-->
<TextBlock Text="Last Name:"/>
<TextBox Text="{Binding LastName}"/> <!-- Validation same as above-->
<TextBlock Text="School:"/>
<TextBox Text="{Binding School}"/>
</StackPanel>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
现在,谁能告诉我如何取消我的编辑(CancelCommand)或以正确的MVVM方式保存它们(SaveCommand)。
现在,当TextBox失去焦点并且无法撤消它们时,我的程序会保存它们。
有人可以给我举个例子吗?
而且我不知道我的输入是无效的:
我尝试过:
private void SaveCommand_Execute()
{
//this is the current window
MessageBox.Show(string.Format("Entry is {0}valid", IsValid(this) ? "" : "not "), "Validation", MessageBoxButton.OK, MessageBoxImage.Information);
}
private bool IsValid(DependencyObject obj)
{
return !Validation.GetHasError(obj) && LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>().All(IsValid);
}
但是,即使我的TextBox显示错误,我的函数也会告诉我该条目有效。
感谢你们对我的帮助!
最佳答案
如果要验证,则需要在实体上实现INotifyDataErrorInfo
。如果要还原更改,则需要实现IRevertibleChangeTracking
。如果您以前从未做过,那么这两项任务都不容易。
还有另一种方法可以解决“接受/取消”问题。当您开始编辑Person
时,会将所有数据复制到PersonViewModel
。然后,您将对PersonViewModel
进行数据处理,当用户单击“保存”时,将数据复制回Person
,当用户单击“取消”时,只需忽略更改即可。PersonViewModel
类不是必需的,您可以只创建新的实例Person
,但是PersonViewModel
为您提供了UI逻辑上的更多灵活性。例如,您可以在表示层具有密码和重复密码字段,但是在业务实体中,您只想拥有密码。
关于c# - MVVM获得ContentPresenter和CancelEdits的验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31310131/