Вот длинное объяснение того, что по сути является простой проблемой.Я использую Telerilk RadDropDownButton, который отображает список элементов с флажками.
<Controls:RadDropDownButton AutoOpenDelay="0:0:0.0" x:Name="Urgency" VerticalAlignment="Center" Width="150" Content="{Binding Path=ItemsSource, ElementName=UrgencyList, Mode=TwoWay, Converter={StaticResource ButtonTextConverter}}" HorizontalContentAlignment="Left">
<Controls:RadDropDownButton.DropDownContent>
<ListBox x:Name="UrgencyList">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding Name}" ClickMode="Press" IsChecked="{Binding IsChecked, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Controls:RadDropDownButton.DropDownContent>
</Controls:RadDropDownButton>
Как видите, я связал свойство Content с конвертером.Я хочу, чтобы, если ничего не выбрано, чтобы содержимое показывало «Все», а если что-то отмечалось, отображало список # выбранных (отмеченных) элементов.
public class ButtonTextConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Debug.WriteLine("I'm Binding");
int numChecked = 0;
if (value != null)
numChecked = ((ObservableCollection<UrgencyItem>) value).Count(urgencyItem => urgencyItem.IsChecked);
return numChecked > 0 ? string.Format("{0} Items Selected", numChecked) : "All";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
КлассЯ обязуюсь к реализации INotifyPropertyChanged, как требуется.Частичное перечисление здесь:
public class UrgencyItem : INotifyPropertyChanged
{
private int _id;
private bool _isChecked;
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged("Name");
}
}
И я связываю ListBox с данными в коде, например так:
private void SearchParamsVertical_Loaded(object sender, RoutedEventArgs e)
{
urgencyList = new ObservableCollection<UrgencyItem>
{
new UrgencyItem {ID = 1, IsChecked = false, Name = "Non Emergent"},
new UrgencyItem {ID = 2, IsChecked = false, Name = "Emergent"},
new UrgencyItem {ID = 3, IsChecked = false, Name = "Stat Emergent"},
new UrgencyItem {ID = 4, IsChecked = false, Name = "Stroke Protocol"}
};
urgencyList.CollectionChanged += urgencyList_CollectionChanged;
UrgencyList.ItemsSource = urgencyList;
}
ТАК ЧТО ЗДЕСЬ ПРОБЛЕМА ...
Если флажок установлен, значение Content должно обновляться.Это не так.
Причина, по которой это не так, заключается в том, что, хотя запускается уведомление о том, что IsChecked был изменен, это уведомление в основном идет в никуда.Объект UrgencyItem не знает, что он является частью ObservableCollection.И вещь о ObservableCollection состоит в том, что он отправляет уведомления на привязку только тогда, когда элементы ДОБАВЛЕНЫ / УДАЛЕНЫ в коллекцию.Другими словами, изменение свойства элемента в коллекции не вызывает событие CollectionChanged, поскольку объекты не были добавлены / удалены.
Что мне нужно сделать, так это вызвать событие collectionChanged при изменении свойства коллекции.Раньше я знал, как это сделать, но слишком много времени проводил вдали от Silverlight, и я забыл, как.
Кто-нибудь?