WPF:绑定到列表框,选择任何内容时的特殊行为

时间:2015-07-07 05:17:23

标签: wpf listbox

我有一个带有列表框的窗口,以及一个绑定到列表框所选项目的usercontrol详细信息'view'。默认情况下,列表框中没有选择任何内容(据我所知,这是默认行为,这里没什么特别的)。

我想要做的是在列表框中没有选择任何内容时显示某种消息(而不是,但在与详细信息视图相同的位置)。

这是代码,我一直试图将其缩小到尽可能小的范围,因此删除了大部分的MVVM / ViewModel / NotifyPropertyChanged。

我将从窗口开始:

<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";
        }
    }
}

当应用程序启动时,没有选择任何内容,我在左侧看到列表框,在右侧看到3个空文本框。一旦我选择了某些内容,就会填充三个文本框。

我想要的是完全隐藏,直到某些东西被选中。我想我可以使用Binding TargetNullValue或FallBackValue来绑定一个默认项目 - 这不是我想要的。更重要的是,我希望完全隐藏并用其他东西替换它(假设一个按钮,只是为了给出一个想法)。

我认为这里没有任何复杂的东西。我已经搜索了答案,但我只是在列表框绑定,选定项目等方面淹没了略微相关的主题。

1 个答案:

答案 0 :(得分:2)

您可以处理可见性属性,并在SelectedItem等于null并同时显示后者时隐藏一个Panel。

隐藏TextBoxes网格:

<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