WPF Radiobutton Group Problemi

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek

    Selam hocalar,

    WPF'de bir uygulama yapıyorum, radiobuttonlar var ve bunlara şurdaki template'i uyguladım: http://marcangers.com/animated-switch-togglebutton-style-in-wpf/

    Ancak radiobutton grouptaki 2 radiobutton'u da "on" durumuna getirebiliyorum, bunun nedeni ne olabilir?

    <Grid 
            Style="{StaticResource ContentRoot}"
            x:Class="IKA.Views.FarKornaView"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:mui="http://firstfloorsoftware.com/ModernUI"
            xmlns:cal="http://www.caliburnproject.org"
            xmlns:model="clr-namespace:IKA.ViewModels"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:ika="clr-namespace:IKA"
            mc:Ignorable="d"
            d:DataContext="{x:Type model:FarKornaViewModel}">
        <Grid.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="../Resources/toggle.xaml"></ResourceDictionary>
                </ResourceDictionary.MergedDictionaries>
                <ControlTemplate x:Key="RadioButtonStyle" TargetType="ika:RadioButtonExtension">
                    <ika:RadioButtonExtension Style="{StaticResource AnimatedSwitch}"  Width="100" Height="40" HorizontalAlignment="Left" Content="{TemplateBinding ContentPresenter.Content}" />
                </ControlTemplate>
            </ResourceDictionary>
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0" Text="Sol Far"  Style="{StaticResource Heading2}"/>
        <TextBlock Grid.Column="1" Grid.Row="0" Text="Sağ Far"  Style="{StaticResource Heading2}" />
        <TextBlock Grid.Column="0" Grid.Row="3" Text="Üst Far" Style="{StaticResource Heading2}" />
        <TextBlock Grid.Column="1" Grid.Row="3" Text="Aşağı Far"  Style="{StaticResource Heading2}"/>
    
        <ika:RadioButtonExtension x:Name="far_1" Grid.Column="0" Grid.Row="1" GroupName="Sol" Template="{StaticResource RadioButtonStyle}"  Content="Sürekli Yak" />
        <ika:RadioButtonExtension x:Name="far_2" Grid.Column="0" Grid.Row="2" GroupName="Sol" Template="{StaticResource RadioButtonStyle}"  Content="Yak Söndür"/>
        <ika:RadioButtonExtension x:Name="far_3" Grid.Column="1" Grid.Row="1" GroupName="Sağ" Template="{StaticResource RadioButtonStyle}"  Content="Sürekli Yak"  cal:Message.Attach="RadioButtonHandler(far_3.GroupName,far_3.Content,far_3.IsChecked)"/>
        <ika:RadioButtonExtension x:Name="far_4" Grid.Column="1" Grid.Row="2" GroupName="Sağ" Template="{StaticResource RadioButtonStyle}"  Content="Yak Söndür"   cal:Message.Attach="RadioButtonHandler(far_4.GroupName,far_4.Content,far_4.IsChecked)"/>
        <ika:RadioButtonExtension x:Name="far_5" Grid.Column="0" Grid.Row="4" GroupName="Yukarı" Template="{StaticResource RadioButtonStyle}" Content="Sürekli Yak"  cal:Message.Attach="RadioButtonHandler(far_5.GroupName,far_5.Content,far_5.IsChecked)"/>
        <ika:RadioButtonExtension x:Name="far_6" Grid.Column="0" Grid.Row="5" GroupName="Yukarı" Template="{StaticResource RadioButtonStyle}" Content="Yak Söndür"   cal:Message.Attach="RadioButtonHandler(far_6.GroupName,far_6.Content,far_6.IsChecked)"/>
        <ika:RadioButtonExtension x:Name="far_7" Grid.Column="1" Grid.Row="4" GroupName="Aşağı" Template="{StaticResource RadioButtonStyle}" Content="Sürekli Yak"  cal:Message.Attach="RadioButtonHandler(far_7.GroupName,far_7.Content,far_7.IsChecked)"/>
        <ika:RadioButtonExtension x:Name="far_8" Grid.Column="1" Grid.Row="5" GroupName="Aşağı" Template="{StaticResource RadioButtonStyle}" Content="Yak Söndür"   cal:Message.Attach="RadioButtonHandler(far_8.GroupName,far_8.Content,far_8.IsChecked)"/>
        
    </Grid>

     


    İnsan; insan olsaydı,insan olmazdı..
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek
    using System.Windows;
    using System.Windows.Controls;
       
    namespace IKA
    {
      public class RadioButtonExtension : RadioButton
      {
        public static int WasChecked { get; set; }
     
        public bool? IsCheckedChanged
        {
            get
            {
                return (bool?)GetValue(IsCheckedChangedProperty);
            }
           set { SetValue(IsCheckedChangedProperty, value); }
        }
        
        // Using a DependencyProperty as the backing store for IsChanged.  
       //This enables animation, styling, binding, etc...
      public static readonly DependencyProperty IsCheckedChangedProperty =
            DependencyProperty.Register("IsChanged", typeof(bool?), 
              typeof(RadioButtonExtension),
          new FrameworkPropertyMetadata(false, 
          FrameworkPropertyMetadataOptions.Journal |
          FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
            CheckedChanged));
          
         public static void CheckedChanged(DependencyObject d, 
                  DependencyPropertyChangedEventArgs e)
         {
           ((RadioButtonExtension)d).IsChecked = (bool)e.NewValue;
         }
        
         public RadioButtonExtension()
         {
            this.Checked += new RoutedEventHandler(RadioButtonExtension_Checked); 
            this.Click += RadioButtonExtension_Click;
         }
     
         void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
         {
            if (WasChecked > 0)
            {
              this.IsCheckedChanged = !this.IsCheckedChanged;
            }
            WasChecked = 1;
         } 
     
        void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
        {
          this.IsCheckedChanged = true;
          WasChecked = 0;
        }
      }
    }
    

    RadioButtonExtension ile alakalı galiba ama  çözemedim onun da içeriğini koyayım:

     


    İnsan; insan olsaydı,insan olmazdı..
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek

    çözüme bir adım daha yaklaştım, buttonu check edince radiobuttonextension'ın hem checked hem click event leri çalışıyor o yüzdne ischecked önce true oluyor sonra false bu yüzden de sapıtıyor, peki bunun önüne nasıl geçeceğim?


    İnsan; insan olsaydı,insan olmazdı..
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    şimdi projeye bakamamama bunun için kendin model yaratabilirsin hocam

    buradaki örnekteki gibi

    http://stackoverflow.com/a/1360425/1022138

     

    sanırım bu örneğin aslı da burdan geliyor

    http://www.wpftutorial.net/RadioButton.html

     

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek

    @unbalanced sağol hocam ama gerek kalmadı ona radiobuttonextension'ı düzenleyerek hallettim

    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Security.Cryptography.X509Certificates;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using Caliburn.Micro;
    using FirstFloor.ModernUI.Windows.Media;
    
    namespace IKA
    {
      public class RadioButtonExtension : RadioButton
      {
        public static int WasChecked { get; set; }
     
        public bool? IsCheckedChanged
        {
            get
            {
                return (bool?)GetValue(IsCheckedChangedProperty);
            }
            set
            {
                SetValue(IsCheckedChangedProperty, value);
            }
        }
        
        // Using a DependencyProperty as the backing store for IsChanged.  
       //This enables animation, styling, binding, etc...
      public static readonly DependencyProperty IsCheckedChangedProperty =
            DependencyProperty.Register("IsChanged", typeof(bool?), 
              typeof(RadioButtonExtension),
          new FrameworkPropertyMetadata(false, 
          FrameworkPropertyMetadataOptions.Journal |
          FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
            CheckedChanged));
          
         public static void CheckedChanged(DependencyObject d, 
                  DependencyPropertyChangedEventArgs e)
         {
           ((RadioButtonExtension)d).IsChecked = (bool)e.NewValue;
         }
        
         public RadioButtonExtension()
         {
            this.Click += RadioButtonExtension_Click;
            this.Checked += new RoutedEventHandler(RadioButtonExtension_Checked); 
         }
     
         void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
         {
             if (WasChecked > 0 && IsCheckedChanged==true)
             {
                 this.IsChecked = false;
                 WasChecked = 0;
    
             }
             else if (WasChecked == 0 && IsCheckedChanged == true)
             {
                 WasChecked = 1;
             }
         }
     
        void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
        {
            if (this.IsChecked == true)
            {
                DependencyObject parent = VisualTreeHelper.GetParent(this);
                DependencyObject parent2 = VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(parent));
                var a = parent2.Ancestors().OfType<RadioButtonExtension>()
                    .OrderBy(x => x.GroupName)
                    .Where(x => x.GroupName == this.GroupName && x.Name != this.Name)
                    .AsEnumerable();
                foreach (RadioButtonExtension button in a)
                {
                    button.IsChecked = false;
                }
                IsCheckedChanged = true;
                WasChecked = 0;
            }
            else
            {
                IsCheckedChanged = false;
            }
        }
      }
    }
    

    Yalnız şu anki sıkıntım caliburn'un cal:Message.Attach property sinde belirttiğim method için "No target found for method RadioButtonHandler." diyor, hala çözebilmiş değilim.


    İnsan; insan olsaydı,insan olmazdı..
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek

    cal:Message.Attach sorununun nedeni FarKornaView , viewmodel olarak MainViewModel'i görüyor ama niye anlayabilmiş değilim.

    ayrıntılı bilgiyi şuraya yazdım: http://stackoverflow.com/questions/29776170/cal-message-attach-no-target-found-for-method


    İnsan; insan olsaydı,insan olmazdı..
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek

    uplayalım


    İnsan; insan olsaydı,insan olmazdı..
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek

    bi up daha


    İnsan; insan olsaydı,insan olmazdı..
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    eve geçince bakarım hocam, şimdi işteyim

  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek
    unbalanced bunu yazdı

    eve geçince bakarım hocam, şimdi işteyim

    tamamdır hocam bekliyorum


    İnsan; insan olsaydı,insan olmazdı..
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nickalti
    Lightsaber
    Lightsaber's avatar
    Kayıt Tarihi: 29/Ağustos/2012
    Erkek

    sonunda çözebildim hocalar. nasıl olduğunu anlatayım.

    Şimdi anladığım kadarıyla bu modern.UI'nin menüsü diğer viewları mainview içinde gösteriyor ve direk view'a link verdiği için FarKornaViewModel hiç aktif olamıyor. Bu nedenle MainViewModel kullanılıyor. Aslında FarKornaView.xaml.cs de this.DataContext diyerek doğru ViewModel gösterilebiliyor ancak FarKornaViewModelin parametresiz ctor'u olmadığından sıkıntı çıkarıyordu.

    Bu nedenle öncelikle ViewModelsContainer isminde bir static class oluşturdum.

        public static class ViewModelsContainer
        {
            public static FarKornaViewModel FarKornaViewModel { get; set; }
        }

    Sonrasında MainViewModel'in ctor'unda FarKornaViewModel'in bir örneğini bu property'e atadım.

            public MainViewModel(FarKornaViewModel farKornaViewModel)
            {
                ViewModelsContainer.FarKornaViewModel = farKornaViewModel;
            }


    En son olarak da FarKornaView.xaml.cs'de DataContext'e bu property'i gösterdim.

        public partial class FarKornaView
        {
            public FarKornaView()
            {
                InitializeComponent();
                this.DataContext = ViewModelsContainer.FarKornaViewModel;
            }
        }

    Bu sorun sadece FarKornaView'da olmadığından bunu tüm VMler için yapacağım.

    Stackoverflowdaki soru ve cevap için(daha derli toplu): http://stackoverflow.com/q/29776170/2946122


    İnsan; insan olsaydı,insan olmazdı..
Toplam Hit: 780 Toplam Mesaj: 11