Привязка MVVM к индексу массива - PullRequest
0 голосов
/ 26 октября 2018

Я использую MVVM и пытаюсь привязать индекс массива. Контекст данных элемента управления XAML связан с моделью представления. Когда я создаю экземпляр элемента управления, я отправляю индекс массива в конструктор, а затем назначаю этот индекс ресурсу окна, чтобы XAML мог использовать его напрямую. Значение поступает в конструктор, как и ожидалось, и я могу использовать его в других областях страницы XAML, но по какой-то причине оно не будет работать как индекс массива. Кто-нибудь знает, что здесь происходит?

C #:

public partial class MyControl : UserControl {

    public MyControl(int index) {
        MyIndex = index;
        InitializeComponent();
    }

    private int myIndex;
    public int MyIndex {
        get { return myIndex; }
        set { myIndex = value; }
    }

    private void Mygrid_OnLoaded(object sender, System.Windows.RoutedEventArgs e) {
        Resources["myResourceKey"] = MyIndex;
    }
} 

Вот xaml:

Определите ресурс:

<UserControl.Resources>
    <sys:Int32 x:Key="myResourceKey"></sys:Int32>
</UserControl.Resources>

Это не работает. Я получаю сообщение об ошибке привязки, потому что он не распознает индекс

 <GradientStop Color="{Binding MyObservableCollection[DynamicResource myResourceKey].ColorsBo.PageBackgroundPrimary}" Offset="1"/>

Это работает, поэтому значение ресурса передается в xaml:

<Label Grid.Column="0" Content="{DynamicResource myResourceKey}"/>

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Недействительный следующий XAML:

MyObservableCollection[DynamicResource myResourceKey]

DynamicResource myResourceKey должен быть заменен на константу , например, 1 или 'abc'.

Другой вариант - выполнить поиск в модели представления, предложенной @Martin Zikmund, или использовать мультисвязывание, связывающее как myResourceKey и MyObservableCollection, так и мультиконвертер: https://blog.csainty.com/2009/12/wpf-multibinding-and.html

0 голосов
/ 26 октября 2018

Боюсь, что это не поддерживаемый синтаксис - Binding поддерживает вложенные выражения, но я думаю, что они должны быть целым "значением" свойства (например, Source={StaticResource something} и т. Д.).В этом случае вам требуется вложенное выражение в свойстве Path привязки, и я не думаю, что это сработает.

Почему вам нужно привязать индекс массива и не можете создатьотдельное свойство, которое просто возвращает элемент MyObservableCollection[index] из модели представления?

public Item => MyObservableCollection[MyIndex];

И в XAML:

<GradientStop Color="{Binding Item.ColorsBo.PageBackgroundPrimary}" Offset="1"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...