我为您构建了一个简单的TestClass:

以下类(class):

public abstract class Person : INotifyPropertyChanged

public class Adult : Person

public class Child : Person
  • 人物:名字+姓氏
  • 成人:
  • 公司
  • child :学校

  • 我将此数据存储在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/

    10-12 13:26