/ / Como o auto-rastreamento de entidade com alterações na VM e na interface do usuário? - mvvm, silverlight-4.0, entidade-estrutura-4, wcf-ria-services

Como o auto-rastreamento de entidade com alterações na VM e na interface do usuário? - mvvm, silverlight-4.0, entidade-estrutura-4, wcf-ria-services

meu contexto: Entidade Framework 4.0 + WCF Ria Data Service + Silverlight 4. Suponha que eu tenha entidades People da EF, então eu criei o PeopleVM como:

public class PeopleViewModel : ViewModelBase
{
public PeopleViewModel(){
//....
this._hasChanges = MyDomainContext.HasChanges;
}

private People _People;
public People People
{
get { return _People; }
set
{
if (value != this._People)
{
value = this._People;
this.RaisePropertyChanged("People");
}
}
}

private bool _hasChanges;
public bool HasChanges
{
get { return this._hasChanges; }
set
{
if (this._hasChanges != value)
{
this._hasChanges = value;
this.RaisePropertyChanged("HasChanges");
}
}
}

//........

private RelayCommand _saveCommand = null;
public RelayCommand SaveCommand
{
//.....
}

private RelayCommand _cancelCommand = null;
public RelayCommand CancelCommand
{
//.....
}
}

na interface do usuário xaml, eu defino a ligação como:

<TextBox Text="{Binding People.FirstName, Mode=TwoWay}" />
<TextBox Text="{Binding People.LasttName, Mode=TwoWay}" />

Então eu defino o botão na interface do usuário como:

<Button Content="Save" Command="{Binding SaveCommand}"  IsEnabled="{Binding HasChanges}"/>
<Button Content="Undo" Command="{Binding CancelCommand}" IsEnabled="{Binding HasChanges}"/>

Então o que eu quero é:

  1. inicialmente, o botão deve ser desativado porque não há alterações de dados.

  2. quando o usuário digita alguma na caixa de texto FirstName, LastName, o botão deve estar ativado.

Mas com o código acima, até eu mudo o nome, sobrenome, o botão ainda em estado de desativação.

Como resolver este problema?

Respostas:

1 para resposta № 1

O problema é que o hasChanges do seu viewmodela propriedade não é atualizada quando a propriedade HasChanges do contexto de domínio é atualizada. Eu tipicamente apenas exponho o Contexto de Domínio como uma propriedade no modelo de visão e vinculo os botões ativados diretamente a sua propriedade HasChanges.

public class PeopleViewModel : ViewModelBase
{
public PeopleViewModel(DomainContext context){
this.Context = context;
}

public DomainContext Context
{ get; private set; }


private People _People;
public People People
{
get { return _People; }
set
{
if (value != this._People)
{
value = this._People;
this.RaisePropertyChanged("People");
}
}
}

//........

private RelayCommand _saveCommand = null;
public RelayCommand SaveCommand
{
//.....
}

private RelayCommand _cancelCommand = null;
public RelayCommand CancelCommand
{
//.....
}
}

Aqui está o XAML para a interface do usuário para ligar ao HasChanges do contexto:

<Button Content="Save" Command="{Binding SaveCommand}"  IsEnabled="{Binding Context.HasChanges}"/>
<Button Content="Undo" Command="{Binding CancelCommand}" IsEnabled="{Binding Context.HasChanges}"/>

Você deve certificar-se de que o objeto Pessoas seja retirado do DomainContext para que as atualizações afetem a propriedade HasChanges desse DomainContext.