Видимость не обновляется при привязке к количеству коллекции через конвертер значений - PullRequest
2 голосов
/ 10 июня 2011

У меня есть ListBox, в котором можно выбрать несколько элементов одновременно. У меня есть UserControl, который должен быть виден, если выбран только один элемент в ListBox.

Вот панель, которую нужно скрыть:

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

Объект SelectedList - это ObservableCollection, который заполняется элементами, выбранными пользователем в ListBox. (Я использовал поведение, чтобы сделать это.)

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();
    }
}

Когда я запускаю приложение, панель скрыта и остается скрытой. Видимость не обновляется, когда я выбираю различное количество элементов в ListBox. Как я могу убедиться, что обновления видимости? Может быть, мне нужно использовать INotifyPropertyChanged, но я не знаю точно, как это сделать.

1 Ответ

1 голос
/ 10 июня 2011

Подход, который я выбрал бы, - добавить новое свойство к связанному объекту, логическое свойство 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 {};

}

Итак, теперь вам нужен простой BoolToVisibilityConverter, есть множество примеров такой вещи, я предпочитаю свой собственный here .

Затем вы xaml (при условии, что вы поместили экземпляр преобразователя в ресурсы с помощью клавиши "BtoV"):

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