Я бы использовал общий, который вы могли бы обрабатывать внешним ...
/// <summary>
/// Generic object copy of the same type
/// </summary>
/// <typeparam name="T">The type of object to copy</typeparam>
/// <param name="ObjectSource">The source object to copy</param>
public T CopyObject<T>(T ObjectSource)
{
T NewObject = System.Activator.CreateInstance<T>();
foreach (PropertyInfo p in ObjectSource.GetType().GetProperties())
NewObject.GetType().GetProperty(p.Name).SetValue(NewObject, p.GetValue(ObjectSource, null), null);
return NewObject;
}
DataTrigger стреляет, но Текстовое поле для Вашего второго TextBlock трудно кодируется как "объекты, выбранные", таким образом, это не будет в состоянии измениться. Чтобы видеть, что он стреляет, можно удалить текст = "выбранные объекты".
Вашей проблемой является хороший кандидат на использование ValueConverter вместо [1 111] DataTrigger. Вот то, как создать и использовать ValueConverter, чтобы заставить его устанавливать текст на то, что Вы хотите.
Создают этот ValueConverter:
public class CountToSelectedTextConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((int)value == 1)
return "item selected";
else
return "items selected";
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Добавляют ссылку пространства имен на Ваш блок, преобразователь расположен:
xmlns:local="clr-namespace:ValueConverterExample"
Добавляют преобразователь к Вашим ресурсам:
<Window.Resources>
<local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/>
</Window.Resources>
Изменение Ваш второй textblock к:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/>
С другой стороны, Вы могли заменить свой XAML этим:
<TextBlock Margin="0,0,5,0" Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}"/>
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="items selected"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
<Setter Property="Text" Value="item selected"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Преобразователи могут решить много обязательных проблем, но имеющий много специализированных преобразователей становится очень грязным.