newMemberInTown Ответов: 1

Установите все флажки с помощью кнопки, когда флажок помещен внутри itemscontrol и с привязкой данных к наблюдаемой коллекции


Привет,

У меня есть список строк и чекбоксов. Он имеет два свойства: одно-ItemName, а другое-CheckedStatus. Я хочу, чтобы эта кнопка могла проверить все флажки.

<ItemsControl Name="IC" ItemsSource="{Binding ItemsSorted}">
 <ItemsControl.ItemTemplate>
  <DataTemplate>
    <StackPanel>
      <CheckBox Name="Mycb" IsThreeState="False"

        FontSize="12" Foreground="WhiteSmoke" 

        Content="{Binding ItemName}" IsChecked="{Binding IsChecked}"/>
    </StackPanel>
   </DataTemplate>
  </ItemsControl.ItemTemplate>
 </ItemsControl>



Тогда у меня есть здесь кнопка в том же окне но вне ItemsControl конечно

<Button Grid.Row="1" Content="Select All" Name="SelectAll" Style="{StaticResource ButtonStyle}" MinWidth="150" Margin="0,5,20,20" Click="SelectAll_Click"/>


Вот WindowAViewModel.в CS

public WindowAViewModel(string pageTitle, WindowBViewModel windowBViewModel)
        {
            PageTitle = pageTitle;

            MyItems.Add(new MyCustomItemViewModel("Apple", windowBViewModel));
            MyItems.Add(new MyCustomItemViewModel("Orange", windowBViewModel));
            MyItems.Add(new MyCustomItemViewModel("Banana", windowBViewModel));
        }


Вот MyCustomItemViewModel.в CS

[ImplementPropertyChanged]
    public class MyCustomItemViewModel
    {
        public string ItemName { get; set; }
        public bool IsChecked { get; set; }
        public WindowBViewModel WindowBViewModelObj { get; set; }

        public MyCustomItemViewModel(string itemName, WindowBViewModel windowBViewModel)
        {
            ItemName = itemName;
            WindowBViewModelObj = windowBViewModel;
        }

        private void OnIsCheckedChanged()
        {
            if (IsChecked)
                WindowBViewModelObj.MyItems.Add(this);
            else
                WindowBViewModelObj.MyItems.Remove(this);
        }
    }


а вот и BaseWindowViewModel.cs

public class BaseWindowViewModel
    {
        public string PageTitle { get; set; }

        private ObservableCollection<MyCustomItemViewModel> _myItems;
        public ObservableCollection<MyCustomItemViewModel> MyItems
        {
            get
            {
                if (_myItems == null)
                {
                    _myItems = new ObservableCollection<MyCustomItemViewModel>();
                    _myItemsSorted = CollectionViewSource.GetDefaultView(_myItems);
                    _myItemsSorted.SortDescriptions.Add(new SortDescription() { PropertyName = "ItemName" });
                }
                return _myItems;
            }
        }

        private ICollectionView _myItemsSorted;
        public ICollectionView MyItemsSorted { get { return _myItemsSorted; } }
    }


Что я уже пробовал:

Я уже пробовал это:

private void SelectAll_Click(object sender, RoutedEventArgs e)
  {
  foreach (var currentItem in IC.Items)
     {
     var container = IC.ItemContainerGenerator.ContainerFromItem(currentItem) as FrameworkElement;
     var checkBox = container.FindName("Mycb") as CheckBox;
         {
            checkBox.IsChecked = true;
         }
        }
       }


но выдал исключение " System. NullReferenceException: 'ссылка на объект не установлена на экземпляр объекта"."

1 Ответов

Рейтинг:
1

Michael_Davies

Вы получаете нулевую ссылку, потому что.FindName ничего не нашел, проверьте возвращаемое значение перед использованием, если что-то было возвращено, проверьте его. Если ничего не возвращается, а должно быть одно, то это более глубокая проблема.


newMemberInTown

На самом деле в нем есть один, но он все равно ломается и говорит:

исключение {"ссылка на объект не установлена на экземпляр объекта".} System.NullReferenceException

Michael_Davies

Он может иметь один, но он не найден, если вы проверите флажок var, вы, вероятно, обнаружите, что он равен нулю, и вы предполагаете, что Find вернул что-то и использует его независимо.

Поставьте тест на checkBox != Null, затем check = true, и вы можете обнаружить, что нулевая ссылка исчезает, тогда у вас возникнет более глубокая проблема, почему она не найдена.