【发布时间】:2018-02-16 16:55:48
【问题描述】:
我有一个 StackPanel,当同一窗口中的 ListView 中没有选定项目时,我想隐藏它。目前,当我打开窗口时,没有选定的项目并且 StackPanel 被隐藏,但是当我从 ListView 中选择某些内容时,没有发生任何变化。
我在 ListView 中绑定 SelectedItem,例如:
<ListView
MinHeight="0"
MaxHeight="500"
Margin="10,10,10,0"
Background="#e7f5f4"
BorderThickness="0"
ItemsSource="{Binding Issues}"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
SelectedItem="{Binding SelectedIssue}"
SelectionMode="Single">
其中“SelectedIssue”是我的 ViewModel 中的自定义类属性(我的整个窗口具有相同的 DataContext)。我目前将 StackPanel 的 Visibility 属性绑定为:
<StackPanel
Grid.Column="1"
Margin="13,0,0,5"
VerticalAlignment="Bottom"
Background="#ebf7f6"
Orientation="Horizontal"
Visibility="{Binding SelectedIssue,
Converter={StaticResource NullToVisibilityConverter},
UpdateSourceTrigger=PropertyChanged}">
我的转换器是:
public class NullToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我错过了什么?
编辑:这是我的 getter/setter
private Issue _selectedIssue;
public Issue SelectedIssue
{
get { return _selectedIssue; }
set { Set(ref _selectedIssue, value); }
}
public void RaisePropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public bool Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
return false;
storage = value;
RaisePropertyChanged(propertyName);
return true;
}
【问题讨论】:
-
你能显示 SelectedIssue 的 getter/setter 吗?可能只是在 SelectedIssue 更改时缺少属性更改事件。除非您告诉 UI,否则 UI 不会知道值已更改...
-
刚刚添加。我在提出这个事件,对吧?
-
绑定生效时,您是否在 Visual Studio 的输出窗口中看到任何绑定错误?有时他们很容易错过。
-
@Michael Holvey 调用 Set(ref _selectedIssue, value); 时缺少属性名称应该是 Set(ref _selectedIssue, value, "SelectedIssue");