DataBind значение словаря для ObservableCollection C # - XAML - PullRequest
0 голосов
/ 30 июня 2018

У меня есть наблюдаемая коллекция пользовательских объектов и переменная общедоступного словаря.

Я бы хотел, чтобы атрибут «BrandName» выступал в качестве ключа для словаря «Бренды» и связывал цвет с кнопкой. Как бы я поступил так? Переменная словаря находится за пределами класса.

C # код:

private ObservableCollection<BusService> BusServicesGUI;
public Dictionary<String, Brush> Brands;

public MainWindow(Dictionary<String, BusService> busServices)
{
    InitializeComponent();
    BusServicesGUI = new ObservableCollection<BusService>(BusServices.Values);
    lstMachineFunctions.ItemsSource = BusServicesGUI;
    lstMachineFunctions.Items.Refresh();
}

C # Класс:

public class BusService
{
    public string ServiceNumber { get; set; }
    public string BrandName { get; set; }
    public List<Location> Locations { get; set; }

    public BusService(string brandName, string serviceNumber)
    {
        BrandName = brandName;
        ServiceNumber = serviceNumber; 
        Locations = new List<Location>();
    }
}

КОД XAML:

<StackPanel x:Name="ServiceStack">
    <ItemsControl x:Name="lstMachineFunctions">
        <ItemsControl.ItemTemplate  >
            <DataTemplate>   
                <Grid HorizontalAlignment="Stretch">
                    <usercontrols:BusServiceCard/>
                     <Button Tag="{Binding ServiceNumber}" Background="{Binding Brands[BrandName]}" Height="50" Click="ButtonCl"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</StackPanel>

Как вы можете видеть из XAML, которые пытались предпринять мои текущие попытки Background="{Binding Brands[BrandName]}" Это, однако, не сработало, любая помощь будет высоко ценится.

1 Ответ

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

Вы можете использовать IValueConverter для выполнения этой операции.

public class BrandColorConverter : IValueConverter
{
    public Dictionary<String, Brush> Brands = new Dictionary<string, Brush>()
    {
        { "brand1", Brushes.Red },
        { "brand2", Brushes.Blue }
    };

    public object Convert(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
    {
        if (!(value is BusService))
            return Binding.DoNothing;

        var busService = (BusService)value;

        if (!Brands.ContainsKey(busService.BrandName))
            return Binding.DoNothing;

        return Brands[busService.BrandName];
    }

    public object ConvertBack(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

В xaml добавьте его как статический ресурс:

<Window.Resources>
    <local:BrandColorConverter x:Key="BrandColorConverter"/>
</Window.Resources>

И используйте это в своей кнопке:

  <Button Tag="{Binding ServiceNumber}" 
     Background="{Binding Converter={StaticResource BrandColorConverter}}" 
     Height="50" 
     Click="ButtonCl"/>

Эта привязка переходит к текущему элементу, поэтому весь объект BusService будет передан преобразователю.

Надеюсь, это решит вашу проблему.

Я бы настоятельно рекомендовал вам ознакомиться с шаблоном MVVM, если вы собираетесь использовать WPF с привязкой данных, поскольку это значительно упрощает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...