2016-02-13 2 views
1

У меня есть набор элементов в моем приложении, и я хочу установить Content из ContentPresenter в один из этих элементов. Элемент будет произвольно определен индексом int. Я могу связать элемент, как это:Binding Indexer

<ContentPresenter Content={Binding Items[0]}/> 

, но не так:

<ContentPresenter Content={Binding Items[{Binding Index}]}/> 

Я видел несколько ответов предлагая с помощью MultiBinding в WPF, но это не доступно в UWP. Есть ли альтернатива?

ответ

1

Вы можете создать свойство вид модели, возвращая Items[Index]:

public string RandomItem => Items[Index]; 

Для PropertyChanged уведомлений на работу, вам нужно будет поднять событие, когда Index или Items изменения, например:

public int Index 
{ 
    get { return _index; } 
    set 
    { 
     _index = value; 
     RaisePropertyChanged(); 
     RaisePropertyChanged(() => RandomItem); 
    } 
} 

Если вы предпочитаете иметь логику в представлении и переходите к многосвязному способу, вы можете использовать Cimbalino toolkit. Для того, чтобы работать, сначала добавьте 2 пакета NuGet:

Теперь вы можете создать конвертер:

public class CollectionIndexConverter : MultiValueConverterBase 
{ 
    public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var collection = (IList) values[0]; 
     var index = (int?) values[1]; 
     return index.HasValue ? collection[index.Value] : null; 
    } 

    public override object[] ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

И использовать его из XAML:

<ContentPresenter> 
    <interactivity:Interaction.Behaviors> 
     <behaviors:MultiBindingBehavior PropertyName="Content" Converter="{StaticResource CollectionIndexConverter}"> 
      <behaviors:MultiBindingItem Value="{Binding Items}" /> 
      <behaviors:MultiBindingItem Value="{Binding Index}" /> 
     </behaviors:MultiBindingBehavior> 
    </interactivity:Interaction.Behaviors> 
</ContentPresenter> 
Смежные вопросы