打破实体框架实体参考链接

时间:2014-05-11 17:45:39

标签: c# wpf entity-framework mvvm

这可能是一个新手问题,但我对这个问题感到不满。 我正在使用MVVM模式在WPF中构建应用程序。我有一个视图,其中包含一个显示当前客户实体的属性的字段。在视图中,我有一个命令来更改属于该客户的银行帐号。调用的命令将整个子实体作为参数。然后调用另一个函数,该函数也将子实体作为参数并将其传递给绑定到新视图的新视图模型,该新视图显示为更改对话框。这一切都有效。但是当我在对话框中更改银行帐号时,原始视图也会实时更改帐号。他们仍然相互联系。我想取消此链接,以便取消对话框以及我在该对话框中所做的更改。但是我无法让它发挥作用。

代码说的更多的话。

查看主要

<dxlc:LayoutGroup Header="Rekeningen" View="GroupBox" Orientation="Vertical"  VerticalAlignment="Stretch">
    <dxlc:LayoutItem>
        <StackPanel>
            <Button Content="{x:Static language:Common.NieuwRekeningnrToevoegen}" Command="{Binding NieuwRekeningCommand}" />
            <ListView ItemsSource="{Binding CurrentRelatie.Rekeningnummers}" ItemTemplate="{StaticResource RelatieRekeningnrTemplate}" />
        </StackPanel>
    </dxlc:LayoutItem>
</dxlc:LayoutGroup>

查看项目模板MAIN

<DataTemplate x:Key="RelatieRekeningnrTemplate">
    <Grid>
        <TextBlock >
            <Run Text="{Binding Omschrijving}" FontWeight="Bold" FontStyle="Italic" /> <LineBreak/>
            <Run Text="{Binding RekNummer}" /> - <Run Text="{Binding BicNummer}" FontStyle="Italic" />
        </TextBlock>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top">
            <Button Command="{Binding DataContext.VerwijderRekeningCommand, RelativeSource={RelativeSource AncestorType=UserControl}}" CommandParameter="{Binding}">
                <Button.Style>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="Background" Value="{x:Null}" />
                        <Setter Property="BorderBrush" Value="{x:Null}" />
                        <Setter Property="BorderThickness" Value="1" />
                        <Setter Property="Template" Value="{DynamicResource tplFlatButton}" />
                    </Style>
                </Button.Style>
                <Path Height="9" Stretch="Uniform" Fill="{DynamicResource AccentColorDarkGray}" Data="{DynamicResource Delete}" />
            </Button>
            <Button Command="{Binding DataContext.EditRekeningCommand, RelativeSource={RelativeSource AncestorType=UserControl}}" CommandParameter="{Binding}">
                <Button.Style>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="Background" Value="{x:Null}" />
                        <Setter Property="BorderBrush" Value="{x:Null}" />
                        <Setter Property="BorderThickness" Value="1" />
                        <Setter Property="Template" Value="{DynamicResource tplFlatButton}" />
                    </Style>
                </Button.Style>
                <Path Height="10" Stretch="Uniform" Fill="{DynamicResource AccentColorDarkGray}" Data="{DynamicResource Edit}" >
                </Path>
            </Button>
        </StackPanel>
    </Grid>
</DataTemplate>

视图模型

private model.Relatie _CurrentRelatie = null;
public model.Relatie CurrentRelatie
{
    get { return _CurrentRelatie; }
    set { SetProperty(ref _CurrentRelatie, value, () => CurrentRelatie); }
}

public ICommand EditRekeningCommand { get; private set; }
void OnEditRekeningExecute(model.Rekeningnummer Rek)
{
    EditRekeningnummer(Rek);
}

private void EditRekeningnummer(model.Rekeningnummer Rek)
{
    Dialog.dRekeningnummerEditViewModel ReknummerVM = new Dialog.dRekeningnummerEditViewModel();
    ReknummerVM.SetRekening(Rek);

    UICommand ResCommand = DialogService.ShowDialog(ReknummerVM.DialogUICommand, string.Format("{0} {1}", Common.Rekening, Rek.Omschrijving ?? Rek.RekNummer), "viewdRekeningnummerEdit", ReknummerVM);
    if (ResCommand == null || ResCommand.IsCancel == true)
        return;
}

查看RekeningnummerEdit

<dxlc:LayoutGroup Orientation="Vertical">

    <dxlc:LayoutItem Label="{Binding CurrentRekening, ConverterParameter=Omschrijving, Converter={StaticResource ModelToDisplay}}">
        <dxe:TextEdit EditValue="{Binding CurrentRekening.Omschrijving, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" ValidateOnTextInput="True" utils:FocusAdvancement.AdvancesByEnterKey="true"/>
    </dxlc:LayoutItem>

    <dxlc:LayoutItem Label="{Binding CurrentRekening, ConverterParameter=RekNummer, Converter={StaticResource ModelToDisplay}}">
        <dxe:TextEdit EditValue="{Binding CurrentRekening.RekNummer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" ValidateOnTextInput="True" utils:FocusAdvancement.AdvancesByEnterKey="true"/>
    </dxlc:LayoutItem>

    <dxlc:LayoutItem Label="{Binding CurrentRekening, ConverterParameter=BicNummer, Converter={StaticResource ModelToDisplay}}">
        <dxe:TextEdit EditValue="{Binding CurrentRekening.BicNummer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" ValidateOnTextInput="True" utils:FocusAdvancement.AdvancesByEnterKey="true"/>
    </dxlc:LayoutItem>

</dxlc:LayoutGroup>

Viewmodel RekeningnummerEdit

public dRekeningnummerEditViewModel()
{ 
DialogUICommand = new List<UICommand>();

    AnnuleerUICommand = new UICommand() {
        Caption=Common.Annuleren,
         Id = MessageBoxResult.Cancel,
         IsCancel=true
    };

    OKUICommand = new UICommand() {
        Caption=Common.Opslaan,
         Id = MessageBoxResult.OK,
         IsDefault=true
    };
    DialogUICommand.Add(OKUICommand);
    DialogUICommand.Add(AnnuleerUICommand);

    CurrentRekening = new model.Rekeningnummer();
}



public void SetRekening(model.Rekeningnummer Rek)
{
    CurrentRekening = Rek;
    IsInEditMode = true;
}

#region "Properties"
private model.Rekeningnummer _CurrentRekening;
public model.Rekeningnummer CurrentRekening
{
    get { return _CurrentRekening; }
    set { SetProperty(ref _CurrentRekening, value, () => CurrentRekening); }
}

#endregion

#region "Private function"


#endregion

#region "Commands"

public List<UICommand> DialogUICommand { get; private set; }
protected UICommand AnnuleerUICommand { get; private set; }
protected UICommand OKUICommand { get; private set; }

1 个答案:

答案 0 :(得分:2)

您看到的行为是因为您正在将对象引用(model.Rek)从视图传递到对话框。因此,当您的对话框更改model.Rek的值时,更改会立即反映在您的视图中。

解决此问题的常用方法是:

  1. 克隆(复制)您的模型,即创建具有相同值的新对象。您可以使用ICloneable界面作为标准模式(如果您只需要浅层副本,MemberwiseClone可以提供帮助)
  2. 将克隆发送到对话框
  3. 如果用户按“确定”,则获取克隆的值并将其复制回原始模型。如果用户按下取消,则不再执行任何操作
相关问题