0

Можно ли использовать индексаторы в Binding? Если да, то каким образом?

По логике в TextBlock в DataContext я указываю индекс объекта из списка, И ему присваиваются свойства из этого объекта, но это не работает.

Необходимо для переключения стилей этих TextBlock и анимации пролистывания страницы при нажатии на кнопку.

View

<Grid Grid.Row="0" Background="#FFCEF4F7">
            <StackPanel
                Orientation="Horizontal"
                VerticalAlignment="Center"
                HorizontalAlignment="Center">
            &lt;TextBlock  
                DataContext=&quot;{Binding Path=Steps[0]}&quot;
                Style=&quot;{DynamicResource stepRegistrationStyle}&quot;
                Text=&quot;{Binding Path=Name}&quot;
                IsEnabled=&quot;{Binding Path=IsShow}&quot;/&gt;

            &lt;TextBlock  
                DataContext=&quot;{Binding Steps[1]}&quot;
                Style=&quot;{DynamicResource stepRegistrationStyle}&quot;
                Text=&quot;{Binding Path=Name}&quot;
                IsEnabled=&quot;{Binding Path=IsShow}&quot;/&gt;

            &lt;TextBlock  
                DataContext=&quot;{Binding Path=Steps[2]}&quot;
                Style=&quot;{DynamicResource stepRegistrationStyle}&quot;
                Text=&quot;{Binding Path=Name}&quot;
                IsEnabled=&quot;{Binding Path=IsShow}&quot;/&gt;

            &lt;TextBlock  
                DataContext=&quot;{Binding Path=Steps[3]}&quot;
                Style=&quot;{DynamicResource stepRegistrationStyle}&quot;
                Text=&quot;{Binding Path=Name}&quot;
                IsEnabled=&quot;{Binding Path=IsShow}&quot;/&gt;

            &lt;TextBlock  
                DataContext=&quot;{Binding Path=Steps[4]}&quot;
                Style=&quot;{DynamicResource stepRegistrationStyle}&quot;
                Text=&quot;{Binding Path=Name}&quot;
                IsEnabled=&quot;{Binding Path=IsShow}&quot;/&gt;

            &lt;Button Margin=&quot;5&quot; Width=&quot;50&quot; Click=&quot;Previos&quot; Content=&quot;Previos&quot;/&gt;
            &lt;Button Margin=&quot;5&quot; Width=&quot;50&quot; Click=&quot;Next&quot; Content=&quot;Next&quot;/&gt;
        &lt;/StackPanel&gt;

    &lt;/Grid&gt;

Model:

internal class StepRegistrationModel : INotifyPropertyChanged
    {
        private string _name;
        private bool _isShow;
        private string _prop;
    public string Name
    {
        get =&gt; _name;
        set
        {
            _name = value;
            OnChangeProperty(&quot;Name&quot;);
        }
    }
    public string Prop
    {
        get =&gt; _prop;
        set
        {
            _prop = value;
            OnChangeProperty(&quot;Prop&quot;);
        }
    }
    public bool IsShow
    {
        get =&gt; _isShow;
        set
        {
            _isShow = value;
            OnChangeProperty(&quot;IsShow&quot;);
        }
    }

    public event PropertyChangedEventHandler? PropertyChanged;
    public void OnChangeProperty([CallerMemberName] string prop = &quot;&quot;) =&gt;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}

ViewModel

internal class ApplicationViewModels : INotifyPropertyChanged
    {
        public ObservableCollection<StepRegistrationModel> Steps = new ObservableCollection<StepRegistrationModel>()
        {
            new StepRegistrationModel()
            {
                Name = "1. General Information",
                Prop = "generalInformation",
                IsShow = true,
            },
            new StepRegistrationModel()
            {
                Name = "2. Select Exchange",
                Prop = "selectExchange",
                IsShow = false
            },
            new StepRegistrationModel()
            {
                Name = "1. General Information",
                Prop = "generalInformation",
                IsShow = true,
            },
            new StepRegistrationModel()
            {
                Name = "2. Select Exchange",
                Prop = "selectExchange",
                IsShow = false
            }
        };
    private int _actualPage = 0;
    public ApplicationViewModels()
    {

    }

    public event PropertyChangedEventHandler? PropertyChanged;
    public void OnChangeProperty([CallerMemberName] string prop = &quot;&quot;) =&gt;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));

    internal void NextPage()
    {
        if(_actualPage == Steps.Count-1)
            return;
        _actualPage++;

        Steps.ToList().ForEach(x =&gt; x.IsShow = false);
        Steps[_actualPage].IsShow = true;
        OnChangeProperty(&quot;Steps&quot;);
    }

    internal void PreviosPage()
    {
        if (_actualPage == 0)
            return;
        _actualPage--;

        Steps.ToList().ForEach(x =&gt; x.IsShow = false);
        Steps[_actualPage].IsShow = true;
        OnChangeProperty(&quot;Steps&quot;);
    }
}

Kain
  • 11
  • 2
  • Нет, индексов нету. XAML не про индексы, он вообще не должен знать что-либо про данные, а вы это от него хотите. Вы можете сделать конвертор, но это костыль, да и, по сути, нарушение MVVM. Да и вообще ваша задача в целом, это нарушение MVVM, ибо вы пытаетесь заставить View слой управлять ViewModel (как кстати и Click, ибо в MVVM клик это ICommand). Ваша задача решается примерно так, где при изменении свойства, XAML лишь воспроизводит нужную анимацию, а VM слой меняет контент. – EvgeniyZ Oct 09 '22 at 10:19
  • Если вопрос про навигацию, то вот еще решение https://ru.stackoverflow.com/a/1266479/373567 – aepot Oct 09 '22 at 10:24

0 Answers0