2012-10-02 31 views
5

içinde nasıl yenileyebilir Projem MVVM modeline dayanmaktadır.Kullanıcı arayüzünü MVVM WPF

Dosya sistemimi gösteren bir ağaç görünümü oluşturdum. Her klasörün geçerli klasörü seçmek için bir onay kutusu vardır. Seçim işlemi biraz zaman alıyor, bu nedenle işlem devam ederken, devre dışı bırakılmış ve işlemin sonunda butonu etkinleştirdiğim bir düğme var.

Sorunum, düğmenin "devre dışı kaldığında" hemen görünmesi. Ancak, düğme etkin moda geri dönerken, düğmenin etkin olduğunu görmek için bazı eylemleri (fare tıklaması gibi) yapmalıyım.

Düğme etkinleştirildikten sonra kullanıcı arabiriminin hemen güncelleneceğinden nasıl emin olabilirim? Bu kodu eklenmiş benim ViewModel yılında

<Button Content="&lt;- Back" Margin="5,0,5,0" Width="80" Height="25" 
     IsEnabled="{Binding CanMoveToPreviousPage, UpdateSourceTrigger=PropertyChanged}" 
     Command="{Binding Path=NavigateBackCommand, IsAsync=True}" /> 

<Button Content="{Binding ButtonNextCaption}" Margin="5,0,5,0" Width="80" Height="25" 
     IsEnabled="{Binding CanMoveToNextPage, UpdateSourceTrigger=PropertyChanged}" 
     Command="{Binding Path=NavigateNextCommand, IsAsync=True}" /> 

:

Bunlar

benim düğmeleri olan

public bool CanMoveToNextPage 
{ 
    get 
    { 
     return this.CurrentPage != null && this.CurrentPage.CanMoveNext; 
    } 
    set 
    { 
     if (CurrentPage != null) 
     { 
      this.CurrentPage.CanMoveNext = value; 
      OnPropertyChanged("CanMoveToNextPage"); 
     } 
    } 
} 

public bool CanMoveToPreviousPage 
{ 
    get { return 0 < this.CurrentPageIndex && CurrentPage.CanMoveBack; } 
    set 
    { 
     if (CurrentPage != null) 
     { 
      this.CurrentPage.CanMoveBack = value; 
      OnPropertyChanged("CanMoveToPreviousPage"); 
     } 
    } 
} 

UI güncellemesi ki, bir fare tıklaması veya herhangi bir tuş vuruşu yürütmek hemen sonra olur.

void bg_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 
{ 
    DecrementDoneCounter(); 
    if (ThreadSafeCouner == 0)//means all bg workers are done 
    { 
     UIlimitation(true); 
    } 
} 

private int ThreadSafeCouner; // check how many bgworkers run 
public void IncrementDoneCounter() { Interlocked.Increment(ref ThreadSafeCouner); } 
public void DecrementDoneCounter() { Interlocked.Decrement(ref ThreadSafeCouner); } 


void bg_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
{ 
    IncrementDoneCounter(); 
    UIlimitation(false); 
    ((bgArguments)e.Argument).SelectedDirectory.CanSelected = false; 
    MarkItems(((bgArguments)e.Argument).SelectedDirectory, ((bgArguments)e.Argument).IsSelect); 
    ((bgArguments)e.Argument).FreeWorkerAllocation(); 
    ((bgArguments)e.Argument).SelectedDirectory.CanSelected = true; 
} 

//this is the enabling action which execute the propeties setters at the upper part of this post 
private static void UIlimitation(bool limit) 
{ 
    MainWindowViewModel.Instance.CanMoveToNextPage = limit; 
    MainWindowViewModel.Instance.CanMoveToPreviousPage = limit; 
} 

Ne yapabilirim:

Bu düğmeleri devre dışı bırakma ve etkinleştirme olan eylemin kodudur?

+1

this.UpdateLayout() veya ButtonsParent.UpdateLayout() –

+0

ne zaman operasyon Düğmeye etkinleştirme/devre dışı sorumlu senin endişe özellikleri için 'OnPropertyChanged' olayı artırıyorlar yapılır deneyin? –

+0

Yaptığım zaman etkin özelliği değiştiriyorum, ancak Set {...} 'i ayarla ve Set {} OnPropertyChanged olayını içeriyor. Ben hata ayıklamaya çalıştığınızda her şey perfevt çalışır ve düğmeye tıklama olmadan etkin olsun. Sorunun ne olduğunu anlayabiliyorum – Ofir

cevap

5

Sen kontrolü Binding mode TwoWay üzerine ayarlayabilir ve Burada UI güncelleştirmek için ileti gönderme INotifyPropertyChanged yöntemi ile ViewModel nasıl oluşturabileceğini bir kod örneği triggers with PropertyChanged

{Binding ElementName=.., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} 
+0

Yaptım ama sorun hala var. – Ofir

+0

MVVM modeli, bildirimleri –

+0

'a bildirmek için INotifyPropertyChanged'i uygulamalıdır. Zaten uygulamıştım – Ofir

1

tanımlayın:

public class MyViewModel : INotifyPropertyChanged 
{ 
    /******************************************************/ 
    /* Property that you have created two-way binding for */ 
    /******************************************************/ 
    private double _myProperty 
    public double MyProperty 
    { 
     get { return _myProperty; } 
     set 
     { 
      _myProperty = value; 

      OnNotifyPropertyChanged("MyProperty"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnNotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion INotifyPropertyChanged Members 
} 
+1

Merhaba, Projem zaten bu kodu içeriyor. – Ofir

+0

OnNotifyPropertyChanged ("MyProperty") değerinin olduğundan emin olun; doğrudur. –

1

Tamam Bir çözüm buldum.
Ben başarılı olamadı şeyi denedim ve sonunda bu parçacığı bulundu: Ben CommandManager.InvalidateRequerySuggested()

Ve eserlerini kullandık Refresh WPF Command

. Yardımlarınız için

Teşekkür