如何更改 ListBox 的 IsVisible 属性?

How can I change IsVisible property of my ListBox?

我正在做一个简单的图书编辑器。
在图书版本中 window 我希望主题和子主题按层次顺序显示,所以我制作了一个带有复杂数据模板的 ItemsControl 来显示它们。我现在拥有的是:

主题是按钮,如果单击相应的主题按钮(就像它是一个下拉列表),我希望子主题的列表框可见。
问题是我正在使用 MVVM,我不能只更改 OnClick 事件中 ListBox 的 IsVisible 属性。
如何在不破坏和 MVVM 模式的情况下做到这一点?

这是我的 XAML 代码:

      <ScrollViewer>
        <Grid ColumnDefinitions="auto, *" RowDefinitions="auto">
          <ItemsControl Grid.Column="0" Grid.Row="0" Items="{Binding Book.Themes}">
            <ItemsControl.ItemTemplate>
              <DataTemplate>
                <StackPanel>
                  <Button Name="kekw" Content="{Binding Name}" />
                  <ListBox Items="{Binding Subthemes}">
                    <ListBox.ItemTemplate>
                      <DataTemplate>
                        <TextBlock Text="{Binding Name}"/>
                      </DataTemplate>
                    </ListBox.ItemTemplate>
                  </ListBox>
                </StackPanel>
              </DataTemplate>
            </ItemsControl.ItemTemplate>
          </ItemsControl>
        </Grid>
      </ScrollViewer>  

这是视图模型:

public class EditBookViewModel
    {
        private Book book;
      
        public Book Book
        {
            get
            {
                return book;
            }
            set
            {
                book = value;
            }
        }
        public EditBookViewModel(string name, string path)
        {
            book = new Book(name, path);
            book.Themes = new LinkedList<Theme>();
            book.Themes.AddLast(new Theme("Theme 1", "Page 1"));
            book.Themes.AddLast(new Theme("Theme 2", "Page 2"));
            book.Themes.AddLast(new Theme("Theme 3", "Page 3"));

            foreach(Theme t in book.Themes)
            {
                t.Subthemes = new LinkedList<Subtheme>();
                t.Subthemes.AddLast(new Subtheme("Subtheme 1", "Page 1"));
                t.Subthemes.AddLast(new Subtheme("Subtheme 2", "Page 2"));
                t.Subthemes.AddLast(new Subtheme("Subtheme 3", "Page 3"));
            }
        }
    }  

我怀疑您是在询问有关 WPF 数据绑定的问题。 我是 Xamarin.Forms 开发人员,如果我愿意为 Xamarin.Forms 做的话,我可以建议我会做什么。

  1. 首先,更新 'Theme' class 以使用一个布尔值 属性 来控制子主题是否应显示或隐藏。 (确保 class 实现 INotifyPropertyChanged,如果你使用 ReactiveUI,你可以从 ReactiveObject 继承);

  2. 在您的 VM 中创建一个命令,并将 <Button Name="kekw" Content="{Binding Name}" /> 绑定到该命令以更新布尔值 属性。 (并且 CommandParameter 绑定到主题。在 Xamarin.Forms 中是“.”);

  3. 将 ListBox.IsVisible 绑定到那个布尔值 属性。