WPF:绑定到列表框,未选择任何内容时的特殊行为
WPF : Binding to a listbox, special behavior when nothing is selected
我有一个带有列表框的 window,以及一个绑定到列表框 selected 项的用户控件详细信息 'view'。默认情况下,列表框中没有任何 selected(据我所知,这是默认行为,这里没有什么特别的)。
我想要做的是在列表框中没有任何内容时显示某种消息(而不是,但与详细信息视图在同一位置)。selected。
这是代码,我一直在尝试将其压缩得尽可能小,因此删除了大部分 MVVM/ViewModel/NotifyPropertyChanged 内容。
我将从 window 开始:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0" Name="ListList"></ListBox>
<view:BoundItem Grid.Column="1" DataContext="{Binding ElementName=ListList, Path=SelectedItem}" ></view:BoundItem>
</Grid>
被绑定的项目只不过是回显一些属性:
<Grid>
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding Foo, Mode=OneWay}"></TextBox>
<TextBox Text="{Binding Bar, Mode=OneWay}"></TextBox>
<TextBox Text="{Binding Baz, Mode=OneWay}"></TextBox>
</StackPanel>
</Grid>
我正在设置填充列表框并一次性定义数据项:
/// <summary>
/// Interaction logic for ListBoxSelectedItemBinding.xaml
/// </summary>
public partial class ListBoxSelectedItemBinding : Window
{
public ListBoxSelectedItemBinding()
{
InitializeComponent();
this.ListList.Items.Add(new ListBoxData());
this.ListList.Items.Add(new ListBoxData());
this.ListList.Items.Add(new ListBoxData());
}
}
public class ListBoxData
{
public string Foo
{
get
{
return "Foo";
}
}
public string Bar
{
get
{
return "FooBar";
}
}
public string Baz
{
get
{
return "FooBarBaz";
}
}
}
当应用程序启动时,select 没有编辑任何内容,我看到左侧是列表框,右侧是 3 个空文本框。一旦我 select 一些东西,三个文本框就会被填充。
我想要的是完全隐藏直到某些东西被 selected。我想我可以提供一个默认项以使用 Binding TargetNullValue 或 FallBackValue 进行绑定——这不是我想要的。更重要的是,我希望完全隐藏并用其他东西替换它(假设一个按钮,只是为了提供一个想法)。
我认为这里没有任何复杂的地方。我已经搜索了答案,但我只是被列表框绑定、selected 项目等稍微相关的主题淹没了。
您可以处理 Visibility 属性 并在 SelectedItem 等于 null 时隐藏一个面板,同时显示后者。
隐藏文本框网格:
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ListList, Path=SelectedItem}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<TextBox/>
<TextBox/>
<TextBox/>
</Grid>
并显示您的按钮网格
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ListList, Path=SelectedItem}" Value="{x:Null}">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Button/>
<Button/>
<Button/>
</Grid>
请记住,它们需要放在同一位置(例如同一列和同一行)。
比处理可见性更复杂的方法是使用 ContentControl,它会根据 ViewModel 的变化自动改变 View。更多 here.
我有一个带有列表框的 window,以及一个绑定到列表框 selected 项的用户控件详细信息 'view'。默认情况下,列表框中没有任何 selected(据我所知,这是默认行为,这里没有什么特别的)。
我想要做的是在列表框中没有任何内容时显示某种消息(而不是,但与详细信息视图在同一位置)。selected。
这是代码,我一直在尝试将其压缩得尽可能小,因此删除了大部分 MVVM/ViewModel/NotifyPropertyChanged 内容。
我将从 window 开始:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0" Name="ListList"></ListBox>
<view:BoundItem Grid.Column="1" DataContext="{Binding ElementName=ListList, Path=SelectedItem}" ></view:BoundItem>
</Grid>
被绑定的项目只不过是回显一些属性:
<Grid>
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding Foo, Mode=OneWay}"></TextBox>
<TextBox Text="{Binding Bar, Mode=OneWay}"></TextBox>
<TextBox Text="{Binding Baz, Mode=OneWay}"></TextBox>
</StackPanel>
</Grid>
我正在设置填充列表框并一次性定义数据项:
/// <summary>
/// Interaction logic for ListBoxSelectedItemBinding.xaml
/// </summary>
public partial class ListBoxSelectedItemBinding : Window
{
public ListBoxSelectedItemBinding()
{
InitializeComponent();
this.ListList.Items.Add(new ListBoxData());
this.ListList.Items.Add(new ListBoxData());
this.ListList.Items.Add(new ListBoxData());
}
}
public class ListBoxData
{
public string Foo
{
get
{
return "Foo";
}
}
public string Bar
{
get
{
return "FooBar";
}
}
public string Baz
{
get
{
return "FooBarBaz";
}
}
}
当应用程序启动时,select 没有编辑任何内容,我看到左侧是列表框,右侧是 3 个空文本框。一旦我 select 一些东西,三个文本框就会被填充。
我想要的是完全隐藏直到某些东西被 selected。我想我可以提供一个默认项以使用 Binding TargetNullValue 或 FallBackValue 进行绑定——这不是我想要的。更重要的是,我希望完全隐藏并用其他东西替换它(假设一个按钮,只是为了提供一个想法)。
我认为这里没有任何复杂的地方。我已经搜索了答案,但我只是被列表框绑定、selected 项目等稍微相关的主题淹没了。
您可以处理 Visibility 属性 并在 SelectedItem 等于 null 时隐藏一个面板,同时显示后者。
隐藏文本框网格:
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ListList, Path=SelectedItem}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<TextBox/>
<TextBox/>
<TextBox/>
</Grid>
并显示您的按钮网格
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ListList, Path=SelectedItem}" Value="{x:Null}">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Button/>
<Button/>
<Button/>
</Grid>
请记住,它们需要放在同一位置(例如同一列和同一行)。
比处理可见性更复杂的方法是使用 ContentControl,它会根据 ViewModel 的变化自动改变 View。更多 here.