Можно ли управлять видимостью StackPanel (внутри ItemsControl) кнопкой? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть свойство List<Filter> Filters, которое является ItemSource из ItemsControl. То, что я пытаюсь сделать sh, это показать в начале только фильтры, которые имеют свойство IsShown = true. Затем, когда я пу sh кнопку, чтобы показать остальные фильтры. Можно ли это сделать с помощью XAML? Если нет, какой подход я должен использовать?

Содержимое Filter class:

        public List<string> Options { get; set; } = new List<string>();
        public bool IsShown { get; set; }
        public string Title { get; set; }
        public string ValueSelected { get; set; }

        public Filter(List<string> Options, string Title, string ValueSelected, bool IsShown)
        {
            this.Options = Options;
            this.Title = Title;
            this.ValueSelected = ValueSelected;
            this.IsShown = IsShown;
        }

В MainContext Я определил список и кнопку:

        public ObservableCollection<Filter> Filters { get; set; } = new ObservableCollection<Filter>();
        public ICommand DoShowHide

В MainWindow.XAML на данный момент у меня есть следующее:

            <ItemsControl ItemsSource="{Binding Filters}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical" Visibility="{Binding Path=IsShown, Converter={StaticResource BoolToVisConverter} }" Name="MyStackPanel">
                            <TextBlock Text="{Binding Title}"/>
                            <ComboBox ItemsSource="{Binding Path=Options}"
                              SelectedValue="{Binding Path=ValueSelected}" />
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <Button Content="Show/Hide" Command="{Binding DoShowHide}"/>

с упоминанием, что я определил конвертер

<Window.Resources>
   <BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>

**** У меня есть попытался установить для свойства IsShown всех фильтров значение true при нажатии кнопки sh. Не нужно упоминать, что это не сработало ...

        private void ShowHide(object obj)
        {
            MessageBox.Show("message");
            foreach(Filter filter in Filters)
            {
                if(filter.IsShown == false)
                {
                    filter.IsShown = true;
                    NotifyPropertyChanged("Filters");
                }
            }
        }

Спасибо, что нашли время прочитать мой вопрос :)

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Ваш Filter класс должен реализовывать INotifyPropertyChanged. В противном случае изменения свойств внутри этого класса не распространяются на систему привязки.

Вызывать событие ProperyChanged для свойства Filters, как вы это делали, бесполезно.

Примечание: вы можете использовать операцию XOR для переключения логических значений (показать / скрыть).

Сокращенный Filter класс:

class Filter : INotifyPropertyChanged
{       
  private bool isDisplayed
  public bool IsDisplayed
  {
    get => this.isDisplayed;
    set
    {
      if (value != this.isDisplayed)
      {
        this.isDisplayed = value;
        OnPropertyChanged();
      }
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
  { 
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));        
  }
}

Сокращенный DataTemplate для элемента Filter:

<DataTemplate DataType="{x:Type Filter}">
  <StackPanel Visibility="{Binding IsDisplayed, Converter={StaticResource BoolToVisibilityConverter}}">

  </StackPanel>
</DataTemplate>

Модифицированный обработчик выполнения ICommand:

private void ShowHide(object obj)
{
  // Toggle all Filter.IsDisplayed
  foreach (Filter filter in Filters)
  {
    filter.IsDisplayed ^= true;
  }
}
0 голосов
/ 22 апреля 2020

вы можете сделать это с помощью конвертера, где вы возвращаете объект видимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...