C# 如何更改列表框的IsVisible属性?

C# 如何更改列表框的IsVisible属性?,c#,reactiveui,avaloniaui,C#,Reactiveui,Avaloniaui,我正在做一个简单的图书编辑。 在BookEdition窗口中,我希望主题和子主题按层次顺序显示,所以我使用复杂的数据模板制作了ItemsControl来显示它们。我现在拥有的是: 主题是按钮,如果单击相应的主题按钮(如下拉列表),我希望子主题的列表框可见。 问题是我使用的是MVVM,我不能在OnClick事件中更改ListBox的IsVisible属性。 我如何在不破坏MVVM模式的情况下做到这一点 这是我的XAML代码: <ScrollViewer>

我正在做一个简单的图书编辑。
在BookEdition窗口中,我希望主题和子主题按层次顺序显示,所以我使用复杂的数据模板制作了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"));
            }
        }
    }  
公共类EditBookViewModel
{
私人书籍;
公共图书
{
得到
{
还书;
}
设置
{
账面价值;
}
}
公共EditBookViewModel(字符串名称、字符串路径)
{
book=新书(名称、路径);
book.Themes=新建LinkedList();
book.Themes.AddLast(新主题(“主题1”,“第1页”);
book.Themes.AddLast(新主题(“主题2”,“第2页”);
book.Themes.AddLast(新主题(“主题3”,“第3页”);
foreach(书中的主题t.Themes)
{
t、 子主题=新链接列表();
t、 子主题。添加(新子主题(“子主题1”,“第1页”);
t、 子主题。添加(新子主题(“子主题2”,“第2页”);
t、 子主题。添加(新子主题(“子主题3”,“第3页”);
}
}
}  

我怀疑您在询问有关WPF数据绑定的问题。 我是Xamarin.Forms开发者,如果我为Xamarin.Forms做这件事,我可以建议我该怎么做

  • 首先,将“Theme”类更新为有一个bool属性来控制子主题是显示还是隐藏。(确保类实现INotifyPropertyChanged,如果使用的是ReactiveUI,则可以从ReactiveObject继承)

  • 在VM中创建一个命令,并将
    绑定到该命令以更新布尔属性值。(并且CommandParameter绑定到theme.In Xamarin.Forms中为“.”)

  • Bind ListBox.IsVisible对该布尔属性可见