Привязка данных: использование статического ресурса (назначение программно?) DataGrid - PullRequest
1 голос
/ 27 января 2010

Возможно, было бы лучше, если бы я объяснил, почему мне нужно это сделать.

Это не настоящий пример, но в моем рабочем решении пользователь начнет с группы отношений, подобной этой:

яблоко -> красный Банан -> Желтый

В приложении на разных экранах (например, добавление фруктов и добавление цвета) они могут добавлять новые фрукты / цвета. Затем они должны связать их на этом экране, который я строю здесь, но также должны иметь возможность изменить отношения. Поэтому я не могу определить список, жестко закодированный в 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;


}

1 Ответ

3 голосов
/ 27 января 2010

вы можете получить объект ресурсов из своего кода, используя FindResource метод или Resources свойство FrameworkElement. Проверьте, подойдет ли вам приведенный ниже код:

// find resource object
//string[] resource = (string[])FindResource("AllColors");
string[] resource = (string[])Resources["AllColors"];
if (resource != null)
{
    // old values
    foreach (var item in resource)
        Console.WriteLine(item);
    // set new values
    Resources["AllColors"] = new string[] { "red", "blue", "green"};
}
// find resource and show its new values
resource = (string[])Resources["AllColors"];
if (resource != null)
    foreach (var item in resource)
        Console.WriteLine(item);

хотя я не думаю, что это сработает так, как вы хотите, или это правильное решение для вашей задачи. Что вы можете сделать, это определить класс с коллекцией цветов:

public class TestColors
{
    public TestColors()
    {
        Colors = new ObservableCollection<string>();
        Colors.Add("red");
        Colors.Add("blue");
        Colors.Add("green");
    }

    public ObservableCollection<string> Colors { get; set; }
}

в вашем xaml вы можете определить ObjectDataProvider для данного типа объекта и привязать ваш элемент управления к его свойству Colors. Что-то вроде этого:

...
xmlns:local="clr-namespace:YourNamespace"
...
<Window.Resources>
     <ObjectDataProvider x:Key="AllColors0" ObjectType="{x:Type local:TestColors}"/>
</Window.Resources>
...
<ListBox ... 
     DataContext="{StaticResource AllColors0}"
     ItemsSource="{Binding Colors}"/>
...

еще один способ сделать это - привязать элементы управления к свойству окна, например:

public partial class MainWindow : Window
{
    public static string[] TestProperty
    {
        get
        {
            List<string> result = new List<string>();
            result.Add("red");
            result.Add("green");
            result.Add("blue");
            return result.ToArray();
        }
    }

    public MainWindow()
    {
        InitializeComponent();
     ...

XAML:

<ListBox ...
         ItemsSource="{x:Static local:MainWindow.TestProperty}"/>

update0 : определить ресурс в коде

// define resource in the code
Resources["AllColors1"] = new string[] { "red1", "blue1", "green1" };
// show new values
resource = (string[])Resources["AllColors1"];
if (resource != null)
    foreach (var item in resource)
        Console.WriteLine(item);

надеюсь, это поможет, с уважением

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