Вы можете установить Tag
каждого элемента на индекс свойства; как:
//on click event:
(sender as TextBlock).Tag = ((int)((sender as TextBlock).Tag) + 1 ) % MAX;
или
//on click command:
item.currentPropertyIndex = (item.currentPropertyIndex + 1 ) % MAX;
И затем получить целевое значение, используя отражение или метод (GetPropertyValueAt
) в Item
классе:
public string GetPropertyValueAt(int index)
{
switch(index % MAX)
{
//default:
//return prop1;
}
}
или
public string GetPropertyValueAt(int index)
{
this.GetType().GetProperties()[index % MAX];
}
если ваш Item
является связанным списком, то:
public string GetPropertyValueAt(int index)
{
return this.ElementAt(index % MAX);
}
Затем добавьте Tag
к привязке каждого элемента:
<ItemsControl ItemsSource="{Binding ocItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource propSelector}">
<Binding Path=./>
<Binding Path="Tag" RelativeSource="{RelativeSource Self}/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Используя конвертер, вы можете создать свой пользовательский функционал для привязки:
public class PropSelector : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values != null)
{
return (values[0] as Item).GetPropertyValueAt(values[1]);
}
return "";
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
Не забудьте добавить конвертер в ресурсы окна.
Обратите внимание, что использование % MAX
дублируется для обеспечения циклического поведения в любом сценарии.