0

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

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

4

4 回答 4

1

在您的视图模型中,创建一个公共布尔属性“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

于 2012-07-24T16:05:49.853 回答
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"将创建五行仅用于演示。

于 2012-07-24T16:08:28.180 回答
0

你是对的。您将创建一个 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.");

        }


    }
于 2012-07-24T16:09:44.213 回答
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. 这是严格的视图逻辑,实际上不需要视图模型来实现所需的行为
于 2012-07-24T16:36:26.300 回答