我正在使用C#创建我的第一个gui并且我已经观看/阅读了大量关于WPF和MVVM的教程(这是我正在使用的方法),但我坚持认为直觉上应该很容易完成的事情。我有一个列表框,在它上面我想显示一个文本块或标签,上面写着“请从列表中选择项目”,然后在选择项目后消失。
我怎样才能做到这一点?它需要在代码隐藏中写吗?我读过的大多数教程都不鼓励使用代码隐藏,所以我更喜欢不同的解决方案。我假设这不可能直接在XAML中进行,所以我需要创建一个ViewModel变量来保存列表框状态吗?如果是这样,那么我怎样才能使文本块/标签依赖于变量?
答案 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
时,文本块将被隐藏。我喜欢这种方法的两个原因是: