Wpf 通过值转换器绑定到集合计数时,可见性不更新

Wpf 通过值转换器绑定到集合计数时,可见性不更新,wpf,silverlight,silverlight-4.0,binding,visibility,Wpf,Silverlight,Silverlight 4.0,Binding,Visibility,我有一个列表框,可以同时选择多个项目。我有一个UserControl,如果列表框中只有一个项目被选中,它就需要是可见的 以下是需要隐藏的窗格: <views:WebMethodsPane x:Name="WebMethodsPane" Grid.Column="1" Grid.Row="0" Margin="5,5,5,0" Visibility="{Binding SelectedList, Converter={StaticResource SelectionToVisibil

我有一个列表框,可以同时选择多个项目。我有一个UserControl,如果列表框中只有一个项目被选中,它就需要是可见的

以下是需要隐藏的窗格:

<views:WebMethodsPane x:Name="WebMethodsPane"  Grid.Column="1" Grid.Row="0"   Margin="5,5,5,0" 
Visibility="{Binding SelectedList, Converter={StaticResource SelectionToVisibilityConverter}}" />

SelectedList对象是一个ObservableCollection,由用户在列表框中选择的项目填充。(我使用了一种行为来实现这一点。)

SelectionToVisibilityConverter如下所示:

public class SelectionToVisibilityConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var selectedServices = value as ObservableCollection<WebService>;
        return (selectedServices.Count == 1 ? Visibility.Visible : Visibility.Collapsed);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类选择到VisibilityConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
var selectedServices=作为可观察集合的价值;
返回(selectedServices.Count==1?可见性。可见:可见性。折叠);
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}

当我运行应用程序时,窗格将隐藏并保持隐藏状态。当我从列表框中选择不同数量的项目时,可见性没有更新。如何确保可见性更新?可能我需要使用INotifyPropertyChanged,但我不知道具体如何使用。

我将采取的方法是向绑定对象添加一个新属性,即
SingleItemSelected
布尔属性

大致如下:-

 public class YourClass : INotifyPropertyChanged
 {

     public ObservableCollection<WebService> SelectedList {get; private set; }

     // ctor
     public YourClass()
     {
         SelectedList = new ObservableCollection<WebService>();
         SelectedList.CollectionChanged += SelectedList_CollectionChanged;
     }

     private void SelectedList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
     {
         SingleItemSelected = SelectedList.Count == 1;
     }

     private bool mySingleItemSelected
     public bool SingleItemSelected
     {
         get { return mySingleItemSelected; }
         private set
         {
              if (mySingleItemSelected != value)
              {
                   mySingleItemSelected = value;
                   PropertyChanged(this, new PropertyChangedEventArgs("SingleItemSelected"));
              }
         }
     }

     public event PropertyChangedEventHandler PropertyChanged = delegate {};

}
<views:WebMethodsPane x:Name="WebMethodsPane"  Grid.Column="1" Grid.Row="0" Margin="5,5,5,0"
    Visibility="{Binding SingleItemSelected, Converter={StaticResource BtoV}}" />