Можно ли использовать индексаторы в Binding? Если да, то каким образом?
По логике в TextBlock в DataContext я указываю индекс объекта из списка, И ему присваиваются свойства из этого объекта, но это не работает.
Необходимо для переключения стилей этих TextBlock и анимации пролистывания страницы при нажатии на кнопку.
View
<Grid Grid.Row="0" Background="#FFCEF4F7">
<StackPanel
Orientation="Horizontal"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<TextBlock
DataContext="{Binding Path=Steps[0]}"
Style="{DynamicResource stepRegistrationStyle}"
Text="{Binding Path=Name}"
IsEnabled="{Binding Path=IsShow}"/>
<TextBlock
DataContext="{Binding Steps[1]}"
Style="{DynamicResource stepRegistrationStyle}"
Text="{Binding Path=Name}"
IsEnabled="{Binding Path=IsShow}"/>
<TextBlock
DataContext="{Binding Path=Steps[2]}"
Style="{DynamicResource stepRegistrationStyle}"
Text="{Binding Path=Name}"
IsEnabled="{Binding Path=IsShow}"/>
<TextBlock
DataContext="{Binding Path=Steps[3]}"
Style="{DynamicResource stepRegistrationStyle}"
Text="{Binding Path=Name}"
IsEnabled="{Binding Path=IsShow}"/>
<TextBlock
DataContext="{Binding Path=Steps[4]}"
Style="{DynamicResource stepRegistrationStyle}"
Text="{Binding Path=Name}"
IsEnabled="{Binding Path=IsShow}"/>
<Button Margin="5" Width="50" Click="Previos" Content="Previos"/>
<Button Margin="5" Width="50" Click="Next" Content="Next"/>
</StackPanel>
</Grid>
Model:
internal class StepRegistrationModel : INotifyPropertyChanged
{
private string _name;
private bool _isShow;
private string _prop;
public string Name
{
get => _name;
set
{
_name = value;
OnChangeProperty("Name");
}
}
public string Prop
{
get => _prop;
set
{
_prop = value;
OnChangeProperty("Prop");
}
}
public bool IsShow
{
get => _isShow;
set
{
_isShow = value;
OnChangeProperty("IsShow");
}
}
public event PropertyChangedEventHandler? PropertyChanged;
public void OnChangeProperty([CallerMemberName] string prop = "") =>
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 = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
internal void NextPage()
{
if(_actualPage == Steps.Count-1)
return;
_actualPage++;
Steps.ToList().ForEach(x => x.IsShow = false);
Steps[_actualPage].IsShow = true;
OnChangeProperty("Steps");
}
internal void PreviosPage()
{
if (_actualPage == 0)
return;
_actualPage--;
Steps.ToList().ForEach(x => x.IsShow = false);
Steps[_actualPage].IsShow = true;
OnChangeProperty("Steps");
}
}
Click, ибо в MVVM клик этоICommand). Ваша задача решается примерно так, где при изменении свойства, XAML лишь воспроизводит нужную анимацию, а VM слой меняет контент. – EvgeniyZ Oct 09 '22 at 10:19