gpt4 book ai didi

c# - DataBind 字典值到 ObservableCollection C# - XAML

转载 作者:行者123 更新时间:2023-11-30 20:25:42 25 4
gpt4 key购买 nike

我有一个自定义对象的 Observable 集合和一个公共(public)字典变量。

我希望“BrandName”属性充当“Brands”字典的键并将颜色绑定(bind)到按钮。我该怎么做呢?字典变量在类之外。

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]}" 但是这没有用,我们将不胜感激。

最佳答案

您可以使用 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"/>

此绑定(bind)转到当前元素,因此整个 BusService 对象将传递给转换器。

希望它能解决您的问题。

如果您打算将 WPF 与数据绑定(bind)结合使用,我强烈建议您研究 MVVM 模式,因为它使事情变得更加简化。

关于c# - DataBind 字典值到 ObservableCollection C# - XAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51116125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com