WPF Radiobutton Group Problemi
-
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>
-
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:
-
çö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?
-
ş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
-
@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.
-
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
-
uplayalım
-
bi up daha
-
eve geçince bakarım hocam, şimdi işteyim
-
unbalanced bunu yazdı
eve geçince bakarım hocam, şimdi işteyim
tamamdır hocam bekliyorum
-
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