Возможно, было бы лучше, если бы я объяснил, почему мне нужно это сделать.
Это не настоящий пример, но в моем рабочем решении пользователь начнет с группы отношений, подобной этой:
яблоко -> красный
Банан -> Желтый
В приложении на разных экранах (например, добавление фруктов и добавление цвета) они могут добавлять новые фрукты / цвета. Затем они должны связать их на этом экране, который я строю здесь, но также должны иметь возможность изменить отношения. Поэтому я не могу определить список, жестко закодированный в xaml, так как пользователь может его изменить. Поэтому мне нужно загрузить этот список, а затем отобразить его в выпадающих списках. Пока что ни одно из приведенных ниже решений не сработало для достижения этой цели.
У вас есть вопрос относительно StaticResource в следующем контексте:
<toolkit:DataGridTextColumn Header="Name"
Binding="{Binding Name}"
Width="5*" />
<toolkit:DataGridComboBoxColumn Header="Color"
ItemsSource="{Binding Source={StaticResource AllColors}}"
SelectedValueBinding="{Binding Path=Color}"
TextBinding="{Binding Path=Color}"
Width="5*" />
Где AllColors будет определяться как:
<x:Array x:Key="AllColors"
Type="sys:String">
<sys:String>Orange</sys:String>
<sys:String>Yellow</sys:String>
</x:Array>
Кроме того, что я действительно хочу сделать, это установить этот StaticResource программно, в виде списка или массива строк.
Так как я мог это сделать?
Спасибо.
Редактировать 1
Вот что я попробовал:
// find resource object
//var resource = (string[])Resources["Colors"];
var i = 0;
var colors = new string[] { };
foreach (var fruit in fruitList)
{
colors[i] = fruit.Color;
i++;
}
Resources["Colors"] = colors;
Не работает.
Пожалуйста, помогите.
Редактировать 2: мой полный код - это должно сделать более очевидным, как я борюсь с определением ресурса программно
<UserControl x:Class="Wpf.Screen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:Wpf="clr-namespace:Wpf" MinHeight="300" MinWidth="300" Loaded="Screen_Loaded"
Name="Fruits">
<GroupBox>
<toolkit:DataGrid Name="dgFruits"
AutoGenerateColumns="False"
Margin="10"
ItemsSource="{Binding}">
<toolkit:DataGrid.Columns>
<toolkit:DataGridTextColumn
Binding="{Binding Name}"
Header="Fruit Name"
Width="5*"/>
<toolkit:DataGridComboBoxColumn Header="Color"
ItemsSource="{Binding Source={StaticResource AllColors1}}"
SelectedValueBinding="{Binding Path=Color}"
TextBinding="{Binding Path=Color}"
Width="5*" />
</toolkit:DataGrid.Columns>
</toolkit:DataGrid>
</GroupBox>
C #:
namespace Wpf
{
public partial class Screen
public ObservableCollection<Fruit> FruitCollection { get { return fruitCollection; } }
public Screen()
{
LoadFruitFile(); //this loads fruit into ObservableCollection<Fruit> fruitCollection
InitializeComponent();
}
private void Screen_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
var i = 0;
var colors = new string[] { };
foreach (var fruit in fruitList)
{
colors[i] = fruit.Color;
i++;
}
// define resource in the code
Resources["AllColors1"] = colors;
// show new values
var resource = (string[])Resources["AllColors1"];
if (resource != null)
foreach (var item in resource)
Console.WriteLine(item);
dgFruits.ItemsSource = FruitCollection;
}