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.