SORU
17 ŞUBAT 2010, ÇARŞAMBA


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:

  1. Bir düğme seçildiğinde, gruptaki diğer düğmeleri İsChecked özelliklerine vermezyanlış.

  2. 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
18 ŞUBAT 2010, PERŞEMBE


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>

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • El SalvaLobo

    El SalvaLobo

    10 Temmuz 2006
  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • TheGamer2323

    TheGamer2323

    25 Ocak 2009