Wpf 通过值转换器绑定到集合计数时,可见性不更新
我有一个列表框,可以同时选择多个项目。我有一个UserControl,如果列表框中只有一个项目被选中,它就需要是可见的 以下是需要隐藏的窗格: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
<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}}" />