WPF Binding с индексом свойств? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть проект, в котором мне нужно привязать фон TextBox к значению в массиве, где индекс является свойством в DataContext:

Binding backgroundBinding= new Binding();
backgroundBinding.Path = new PropertyPath($"Elements[{Index}].Value");

Я создал привязкув коде, но хотите найти лучший и более элегантный способ сделать это.Должен ли я создать собственный конвертер или есть какой-то способ ссылки на свойство Index в XAML?

1 Ответ

0 голосов
/ 03 июня 2018

Итак, у вас есть два варианта здесь.Я думаю, что вы просите о первом.Я установил два свойства в своем viewmodel - одно для массива цветов, а затем одно для индекса, который я хочу использовать.Я binding им через MultiConverter, чтобы вернуть правильный цвет из массива.Это позволит вам обновлять выбранный вами индекс во время выполнения и менять фон на новый выбранный цвет.Если вам просто нужен статический индекс, который никогда не изменяется, вы должны использовать инструмент IValueConverter вместо IMultiValueConverter, а затем передать индекс с помощью свойства ConverterParameter.

В качестве примечания явыбран для реализации массива типа Color.SolidColorBrush объекты являются дорогостоящими, и их использование поможет уменьшить эти затраты.

public class ViewModel : INotifyPropertyChanged
{
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private Color[] _backgroundColours = new Color[] { Colors.AliceBlue, Colors.Aqua, Colors.Azure };
    public Color[] BackgroundColours
    {
        get => _backgroundColours;
        set
        {
            _backgroundColours = value;
            OnPropertyChanged();
        }
    }

    private int _backgroundIndex = 1;

    public int ChosenIndex
    {
        get => _backgroundIndex;
        set
        {
            _backgroundIndex = value;
            OnPropertyChanged();
        }
    }
}

...

public class BackgroundConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var backgroundColours = values[0] as Color[];
        var chosenIndex = (int)values[1];

        return new SolidColorBrush(backgroundColours[chosenIndex]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

...

<Grid>
    <Grid.DataContext>
        <local:ViewModel />
    </Grid.DataContext>
    <Grid.Resources>
        <local:BackgroundConverter x:Key="backgroundConverter"/>
    </Grid.Resources>
    <TextBox>
        <TextBox.Background>
            <MultiBinding Converter="{StaticResource backgroundConverter}">
                <Binding Path="BackgroundColours" />
                <Binding Path="ChosenIndex" />
            </MultiBinding>
        </TextBox.Background>
    </TextBox>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...