选择列表框项后,如何使文本块消失?

时间:2012-07-24 15:58:59

标签: c# wpf xaml user-interface mvvm

我正在使用C#创建我的第一个gui并且我已经观看/阅读了大量关于WPF和MVVM的教程(这是我正在使用的方法),但我坚持认为直觉上应该很容易完成的事情。我有一个列表框,在它上面我想显示一个文本块或标签,上面写着“请从列表中选择项目”,然后在选择项目后消失。

我怎样才能做到这一点?它需要在代码隐藏中写吗?我读过的大多数教程都不鼓励使用代码隐藏,所以我更喜欢不同的解决方案。我假设这不可能直接在XAML中进行,所以我需要创建一个ViewModel变量来保存列表框状态吗?如果是这样,那么我怎样才能使文本块/标签依赖于变量?

4 个答案:

答案 0 :(得分:1)

在您的viewmodel中,创建一个公共bool属性“VisibilityOfLabel”

private bool visibilityOfLabel;

public bool VisibilityOfLabel 
{
     get
     {
         return visibilityOfLabel;
     } 

     set
     {
         visibilityOfLabel = value;
         RaisePropertyChanged("VisibilityOfLabel");
     }
}

在您的XAML中,如果您已将DataContext设置为ViewModel, 将标签可见性绑定到该属性

<Label Content="{Binding LabelText}" Visible="{Binding VisibilityOfLabel}" />

然后,当您的Combobox更改时,只需将值设置为true或false

修改 您必须在此处使用“可见性”。已经有一个内置转换器 可在此处使用:System.Windows.Controls.BooleanToVisibilityConverter

答案 1 :(得分:1)

仅在XAML中执行此操作

<StackPanel>
    <TextBlock Text="Please select an item!">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Visibility" Value="Collapsed" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedItem, ElementName=lb}" Value="{x:Null}">
                        <Setter Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <ListBox Name="lb" ItemsSource="12345" />
</StackPanel>

ItemsSource="12345"将创建五行仅供演示。

答案 2 :(得分:0)

你是对的。您将创建一个viewmodel变量,用于保存选定的列表框项。您还可以创建另一个保存文本块可见性的变量。然后,您可以从viewmodel

设置文本块的可见性
private string _selectedListBoxItem;
private boolean _textBlockVisibility

public string SelectedListBoxItem
{
get {return _selectedListBoxItem;}
set{_selectedListBoxItem=value;
_textBlockVisibility=false;}
}

public Boolean TextBlockVisibilty
{
get{return _textBlockVisibility;};
set {_textBlockVisibility=value;};
}

您的xaml会将文本块的可见性绑定到TextBlockVisibility。您将不得不使用可见性转换器。类似的东西:

 public class BooleanVisibilityValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                if (((bool)value) == true)
                    return Visibility.Visible;
                else
                    return Visibility.Collapsed;
            }

            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {

            throw new Exception("The method or operation is not implemented.");

        }


    }

答案 3 :(得分:0)

虽然视图模型方法完全有效,但您可以在XAML中完全执行此操作,而不依赖于视图模型。

<StackPanel>
  <TextBlock Text="Please make a selection">
    <TextBlock.Style>
      <Style>
        <Setter Property="Visibility" Value="Hidden" />
        <Style.Triggers>
          <DataTrigger Binding="{Binding ElementName=TheListBox, Path=SelectedIndex}" Value="-1">
            <Setter Property="Visibility" Value="Visible" />
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </TextBlock.Style>
  </TextBlock>

  <ListBox x:Name="TheListBox" ... />
</StackPanel>

在这里,您所做的只是监控SelectedIndex -1,直到做出选择为止。当值不再是-1时,文本块将被隐藏。我喜欢这种方法的两个原因是:

  1. 少编写代码
  2. 这是严格的视图逻辑,实际上不需要视图模型来实现所需的行为