MVVM: görünüm bir model için Bağlayıcı radyo düğmeleri?
DÜZENLEME:Sorun düzeltildi .NET 4.0.
Görünüm bir model IsChecked
düğmesini kullanarak radyo düğmesi grubu bağlamaya çalışıyorum. Diğer mesajları inceledikten sonra, IsChecked
Bu özellik sadece çalışmıyor gibi görünüyor. Birlikte aşağıda ekledim sorun oluşmazsa kısa bir demo hazırladım.
İşte benim sorum: bağlama radyo düğmeleri MVVM kullanarak basit ve güvenilir bir yolu var mı? Teşekkürler.
Ek bilgi:IsChecked
özelliği iki nedenden dolayı çalışmıyor:
Bir düğme seçildiğinde, gruptaki diğer düğmeleri İsChecked özelliklerine vermezyanlış.
Bir düğme seçildiğinde, kendi İsChecked özelliği düğmesi seçildikten sonra ilk kez ayarlamıyor. Bağlama ilk tıklama WPF tarafından yerle bir oluyor tahmin ediyorum.
Proje Demo:Burada sorun oluşmazsa basit bir demo için kod ve biçimlendirme. WPF projesi oluşturmak ve Window1 olarak biçimlendirme değiştirin.aşağıdaki xaml:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
<StackPanel>
<RadioButton Content="Button A" IsChecked="{Binding Path=ButtonAIsChecked, Mode=TwoWay}" />
<RadioButton Content="Button B" IsChecked="{Binding Path=ButtonBIsChecked, Mode=TwoWay}" />
</StackPanel>
</Window>
Window1 kodu değiştirin.xaml.görünüm modeli ayarlar aşağıdaki kodu (hack) ile cs:
using System.Windows;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new Window1ViewModel();
}
}
}
Şimdi Ekle Window1ViewModel.cs
olarak aşağıdaki proje kodu:
using System.Windows;
namespace WpfApplication1
{
public class Window1ViewModel
{
private bool p_ButtonAIsChecked;
/// <summary>
/// Summary
/// </summary>
public bool ButtonAIsChecked
{
get { return p_ButtonAIsChecked; }
set
{
p_ButtonAIsChecked = value;
MessageBox.Show(string.Format("Button A is checked: {0}", value));
}
}
private bool p_ButtonBIsChecked;
/// <summary>
/// Summary
/// </summary>
public bool ButtonBIsChecked
{
get { return p_ButtonBIsChecked; }
set
{
p_ButtonBIsChecked = value;
MessageBox.Show(string.Format("Button B is checked: {0}", value));
}
}
}
}
Sorunu yeniden oluşturmak için, Bir ileti kutusu görünür A. uygulama ve Düğmeyi çalıştırmak, Bir Düğme IsChecked
Bu söylediğim özelliği ayarlanmışdoğru. Şimdi seçme Düğmesi B. Başka bir ileti kutusu, Düğme B IsChecked
özellik için ayarlanmış olduğunu söyleyerek görünürdoğruama yok kutusu Düğmesini gösteren hiçbir mesaj IsChecked
özelliği ayarlanmışyanlış--özelliğini değişiklik olmamıştır.
Şimdi Düğmesini Bir daha. Düğme penceresinde seçili olacak, ama kutusu--IsChecked
özelliği görünür hiçbir mesaj değiştirilmedi. Son olarak, B Butonuna tekrar tıklayın aynı sonuç. IsChecked
özelliği önce düğmeye tıklandığında sonra da düğme için güncelleştirildi.
CEVAP
Eğer Jason önerisi ile başlatırsanız sorun çok güzel ListBox
çevirir bir listeden tek bağlı bir seçim olur. Bu noktada RadioButton
bir liste olarak gösterir, böylece önemsiz ListBox
bir denetim için stil uygulamak.
<ListBox ItemsSource="{Binding ...}" SelectedItem="{Binding ...}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<RadioButton Content="{TemplateBinding Content}"
IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Boolean değerleri ile modeller için Ba...
Nasıl göster Model SONRASI bir eylem E...
Nasıl geçiş düğmeleri bir grup WPF rad...
Model değişim ViewModel uyarmak için N...
Nasıl jQuery ile bir radyo düğmesi kon...