DataGrid tworzony automatycznie, checkBox z funkcją radiobuttona

0

Witam, w WPF tworzę DataGrida i podpinam pod niego kolekcję jako źródło. Każdy element kolekcji ma pole typu Bool, i dla każdego boola generuje mi się CheckBox, jednak chcę by te checkboxy działały jak radiobuttony, tzn. tylko jeden naraz może być zaznaczony. Napisałem klasę dziedziczącą po DataGridCheckBoxColumn, żeby przypisać nowo tworzonym CheckBoxom zdarzenia zaznaczania, jednak nie wiem jak w metodzie obsługującej te zdarzenia dobrać się do całej kolekcji, by móc sprawdzać czy któryś nie jest zaznaczony zanim zaznaczę inny. Oto kod:

 
        private void dataGrid_configuration_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.PropertyType == typeof(bool))
            {
                CustomDataGridCheckBoxColumn checkBoxColumn = new CustomDataGridCheckBoxColumn();
                checkBoxColumn.Header = e.Column.Header;
                checkBoxColumn.Binding = new Binding(e.PropertyName);
                checkBoxColumn.IsThreeState = true;

                // Replace the auto-generated column with the checkBoxColumn.
                e.Column = checkBoxColumn;
            }
        }
    public class CustomDataGridCheckBoxColumn : DataGridCheckBoxColumn
    {
        protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
        {

            CheckBox checkBox = base.GenerateEditingElement(cell, dataItem) as CheckBox;
            checkBox.Checked += new RoutedEventHandler(HandleClick);
            checkBox.Unchecked += new RoutedEventHandler(HandleClick);
            return checkBox;
        }

        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            CheckBox checkBox = base.GenerateEditingElement(cell, dataItem) as CheckBox;
            checkBox.Checked += new RoutedEventHandler(HandleClick);
            checkBox.Unchecked += new RoutedEventHandler(HandleClick);
            return checkBox;
        }

        public void HandleClick(object sender, RoutedEventArgs e)
        {
         
        }
    }
 

Jak poprawnie osiągnąć to o co mi chodzi?

0

Do swojej nadpisanej klasy możesz dodać statyczna kolekcje wszystkich cheakbox'ów i statyczne pole z auktualnie wybranym cheakbox'em. Z tego punktu powinno byc juz prosto. Jesli chcesz tego w uzywać wielu róznych tablicach, mozesz napisać klase w stylu MyRadioButtonGrup która będzie przechowywać ww. informacje i przechowywać jakąś kolekcje tych klas w polu statycznym.
W każdym badz razie cos w tym stylu powinno działać :).

1

Można zrobić łatwiej od innej strony - bez żadnych kontrolek i innych cudów, tylko niech typ elementów tej kolekcji źródłowej implementuje interfejs INotifyPropertyChanged, zawierający zdarzenie PropertyChanged. Kiedy checkbox zostaje zaznaczony, czyli wartość skojarzonej z nim właściwości bool IsChecked zmienia się na true, wywołać metodę OnPropertyChanged("IsChecked"), która zwykle wygląda tak:

void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }
}

Właściciel kolekcji niech nasłuchuje zdarzenia PropertyChanged każdego elementu i gdy ono nastąpi, sprawdzać, czy element je wywołujący ma IsChecked = true. Jeśli tak, to całej reszcie zrobić IsChecked = false.

1 użytkowników online, w tym zalogowanych: 0, gości: 1