К сожалению, этот измененный ответ не так элегантен, как хотелось бы, но он должен работать.
В принципе, используйте другой фиктивный элемент управления в качестве реле для привязки.В частности, этот сценарий возникает, когда вы хотите получить первый и последний из коллекции.Вы не можете просто использовать конвертер, чтобы получить первый / последний и свойство одновременно, потому что если вы измените свойство первого или последнего элемента, конвертер не получит изменение.Поэтому вы должны сделать что-то, что сочетается со свойствами зависимости - почти как какое-то свойство зависимости второго порядка, было бы неплохо.
В любом случае, вот код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows;
using System.Collections;
namespace WpfApplication1
{
public class CollectionHelper : Control
{
public static DependencyProperty CollectionProperty = DependencyProperty.Register(
"Collection",
typeof(IEnumerable),
typeof(CollectionHelper),
new FrameworkPropertyMetadata(OnCollectionChanged));
public IEnumerable Collection
{
get { return GetValue(CollectionProperty) as IEnumerable; }
set { SetValue(CollectionProperty, value); }
}
private static void OnCollectionChanged(object rawSender, DependencyPropertyChangedEventArgs args)
{
CollectionHelper sender = (CollectionHelper)rawSender;
IEnumerable value = args.NewValue as IEnumerable;
if(value==null)
{
sender.First = null;
sender.Last = null;
return;
}
bool isFirstSet = false;
object lastItemTemp = null;
foreach (var item in value)
{
if (!isFirstSet)
{
sender.First = item;
isFirstSet = true;
}
lastItemTemp = item;
}
if (!isFirstSet)
sender.First = null;
sender.Last = lastItemTemp;
}
public DependencyProperty FirstProperty = DependencyProperty.Register(
"First",
typeof(object),
typeof(CollectionHelper));
public object First
{
get { return GetValue(FirstProperty); }
set { SetValue(FirstProperty, value); }
}
public DependencyProperty LastProperty = DependencyProperty.Register(
"Last",
typeof(object),
typeof(CollectionHelper));
public object Last
{
get { return GetValue(LastProperty); }
set { SetValue(LastProperty, value); }
}
}
}
ИФактический вариант использования:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Helper="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Helper:CollectionHelper x:Name="Helper" Collection="{Binding SomeStrings}" />
<TextBlock Text="{Binding ElementName=Helper, Path=First}" />
<TextBlock Text="{Binding ElementName=Helper, Path=Last}" />
</StackPanel>
</Window>
Таким образом, идея заключается в том, чтобы взять первый и последний элемент с помощью управления реле, а затем привязать к ним поля.