如何更改 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 做的话,我可以建议我会做什么。
首先,更新 'Theme' class 以使用一个布尔值 属性 来控制子主题是否应显示或隐藏。 (确保 class 实现 INotifyPropertyChanged,如果你使用 ReactiveUI,你可以从 ReactiveObject 继承);
在您的 VM 中创建一个命令,并将 <Button Name="kekw" Content="{Binding Name}" />
绑定到该命令以更新布尔值 属性。 (并且 CommandParameter 绑定到主题。在 Xamarin.Forms 中是“.”);
将 ListBox.IsVisible 绑定到那个布尔值 属性。
我正在做一个简单的图书编辑器。
在图书版本中 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 做的话,我可以建议我会做什么。
首先,更新 'Theme' class 以使用一个布尔值 属性 来控制子主题是否应显示或隐藏。 (确保 class 实现 INotifyPropertyChanged,如果你使用 ReactiveUI,你可以从 ReactiveObject 继承);
在您的 VM 中创建一个命令,并将
<Button Name="kekw" Content="{Binding Name}" />
绑定到该命令以更新布尔值 属性。 (并且 CommandParameter 绑定到主题。在 Xamarin.Forms 中是“.”);将 ListBox.IsVisible 绑定到那个布尔值 属性。