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 é:
inicialmente, o botão deve ser desativado porque não há alterações de dados.
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 № 1O 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.