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="<- 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 olanpublic 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?
this.UpdateLayout() veya ButtonsParent.UpdateLayout() –
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? –
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