【问题标题】:NullToVisibilityConverter not being triggered by selection change选择更改未触发 NullToVisibilityConverter
【发布时间】: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");

标签: c# xaml mvvm


【解决方案1】:

显然问题在于您没有实现 INotifyPropertyChanged 或者您没有引发(在 SelectedIssue 属性设置器中)PropertyChanged 事件。

但您可以做的更简单,将StackPanel 直接绑定到ListView.SelectedItem

<ListView x:Name="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">

<StackPanel
     Grid.Column="1"
     Margin="13,0,0,5"
     VerticalAlignment="Bottom"
     Background="#ebf7f6"
     Orientation="Horizontal"
     Visibility="{Binding SelectedItem, ElementName=listView
     Converter={StaticResource NullToVisibilityConverter}" >

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2015-09-19
    • 1970-01-01
    • 2014-02-12
    • 2020-11-25
    • 1970-01-01
    • 2016-02-07
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多