Soru WPF Onay kutusu: Değiştirilen kullanımı kontrol edin


WPF veri bağlayıcısında IsChecked özelliğini bazı verilere, ör. kullanıcı ayarı, ancak "CheckChanged" olayını işlemem gerekiyor, ayrı ayrı ele alabileceğimi biliyorum Kontrol, kontrolsüz olay, ama bu değer değiştirildiğinde ne zaman haberdar olmak için herhangi bir yolu var mı?

<CheckBox Content="Case Sensitive" IsChecked="{Binding bSearchCaseSensitive,
          Source={x:Static Properties:Settings.Default}}" />

Not: İşaretlendiğinde veya işaretlenmediğinde umurumda değil. Sadece değiştiğinde haberdar olmak istiyorum.


29
2018-03-18 15:16


Menşei


Bunun için ne istiyorsun? neden bağlamıyorsun IsChecked ViewModel'de birşeye mülk edin ve o mülke tepki verin? UI Veri değil. - Federico Berasategui
Zaten kullanıcı ayarlarına bağlı. UI veri değil, bu sorulan soruyla mı ilgili? - David
Benim düşünceme göre, bu değişiklik olduğunda ViewModel'in farkında olması gerekiyorsa, bunu gerçekten ViewModel'e bağlamanız gerekir, statik bir şey yapmamalısınız, o zaman VM içinden statik değeri değiştirebilirsiniz. - Federico Berasategui
Değeri değiştirmek istemiyorum, değişmiş olayı işlemek ve başka bir şey yapmak istiyorum, örneğin bir mesaj kutusu gösteriliyor. Bu etkinliği çekmek için önerileriniz var mı? - David
cevabımı gör - - Federico Berasategui


Cevaplar:


Sen kutu İşaretli ve denetlenmeyen olayları ayrı ayrı ele almak zorunda. MVVM desenini takip etmek istemezseniz, aynı işleyiciyi her iki etkinliğe de ekleyebilirsiniz ve değişiklik sinyalinizi alırsınız:

<CheckBox Checked="CheckBoxChanged" Unchecked="CheckBoxChanged"/>

ve kod arkasında;

private void CheckBoxChanged(object sender, RoutedEventArgs e)
{
  MessageBox.Show("Eureka, it changed!");
}

WPF'nin bir nedenden ötürü INotifyPropertyChanged ve / veya DependencyProperties kullanan MVVM şablonunu güçlü bir şekilde teşvik ettiğini lütfen unutmayın. Bu işe yarayan bir şey, iyi bir programlama alışkanlığı olarak teşvik etmek istediğim bir şey değil.


68
2018-03-18 16:16





Bunu bir cevaba koyuyorum çünkü bir yorum için çok uzun:

Ne zaman farkında olmak için VM'ye ihtiyacınız varsa CheckBox değişti, gerçekten bağlamanız gerekir CheckBox VM'ye ve statik değere değil:

public class ViewModel
{
    private bool _caseSensitive;
    public bool CaseSensitive
    {
        get { return _caseSensitive; }
        set
        {
            _caseSensitive = value;
            NotifyPropertyChange(() => CaseSensitive);

            Settings.Default.bSearchCaseSensitive = value;
        }
    }
}

XAML:

<CheckBox Content="Case Sensitive" IsChecked="{Binding CaseSensitive}"/>

9
2018-03-18 15:31



@HighScore, Teşekkürler, bu bir çözüm, ama benim durumum için çok fazla. INotifyPropertyChanged için başvurmak istemiyorum, çok hantal. :) - David
@David Nedir? olmadan WPF iki yönlü ciltleme nasıl gidiyor INotifyPropertyChanged? Ayrıca, bu örnekle ilgisi yok, sadece orada bir ViewModel özelliği var. Örneğim bunu kaldırırsanız gayet iyi çalışır. - Federico Berasategui
Doğru, bu iki yönlü bir bağdır. Bu ayar hem okunabilir hem de yazılabilir, ayarlayıcı değişikliği hakkında bilgilendirilmediğim için üzücüdür. - David
@RalfdeKleine, başkaları tarafından işaret edildiği gibi yorumunuzun ne olduğunu bilmiyorum. - David
@RalfdeKleine, bunu asla söylemem. - David


Bir onay kutusu tıklandığında = bir onay kutusu değişikliği aşağıdakileri de çalışır:

<CheckBox Click="CheckboxClicked" />
Private Sub CheckboxClicked(sender As Object, e As System.Windows.RoutedEventArgs)
    '.... do some stuff
End Sub

IsThreeState = "True" iken çalışmanın ek avantajına sahiptir, sadece Checked ve Unchecked öğelerini işlemez.


6
2017-10-24 14:19



Checkbox devre dışı bırakılırsa ancak tıklarsanız ne olur? Sanırım olay hala ateşleniyor, ki bu istenen davranış değil, çoğu zaman - Mario Garcia
Bu olmamalıydı. Devre dışı bırakılmışsa, tıklama etkinliği de devre dışı bırakılır. - Expenzor


Bunun eski bir soru olduğunu biliyorum, ama nasıl bağlanacağına Command MVVM kullanıyorsanız?

örn:

<CheckBox Content="Case Sensitive" Command="{Binding bSearchCaseSensitive}"/>

Benim için her ikisinde de tetikleniyor Check ve Uncheck.


4
2017-10-03 21:31





Ne hakkında Kontrol Etkinlik? İle birleştirmek AttachedCommandBehaviors veya benzer bir şey ve DelegateCommand Bu olay çağrıldığında her zaman viewmodel'de bir işlev almak için.


0
2018-03-18 15:20



Söz konusu yorumda belirtildiği gibi, Checked / Unchecked olay işleyicisini kullanmak istemiyorum, "değiştirdiğim" sinyalini önemsiyorum. - David