powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Silverlight binding вопрос
20 сообщений из 20, страница 1 из 1
Silverlight binding вопрос
    #37381293
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в следующем:
Имеется XAML, который добавляется динамически в контрол, в этом XAML определен биндинг для некоторых элементов, по типу
<TextBox Text="{Binding SystemName}" />
Причем имя ресурса к которому обращаемся (SystemName) заранее не определено, т.е. это ячейка из столбца таблицы (может меняться).
То есть необходимо по имени ресурса, определять есть ли вообще такое имя в таблице, А если есть выдавать какое либо значение.
Реально ли вообще такое сделать?
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37381298
LxTLT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mast67,

А почему нельзя биндится к какой то переменной, а значение этой переменной задавать в зависимости от данных в таблице. Не очень понятна проблема. Что за таблица? Подробности нужны.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37381328
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LxTLT,

В том то и дело что значения могут быть разными и в переменную не записать какое либо значение, т.к. заведомо не известно что запросят.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37381617
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Binding на сам объект + ValueConverter. В нём описанная логика. Выглядеть будет как-то так:
Код: plaintext
<TextBox Text="{Binding Converter={StaticResource MyConverter}}" />
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37381619
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так:
Код: plaintext
<TextBox Text="{Binding ИмяРесурса, Converter={StaticResource MyConverter}}" />
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37381830
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
использование конвертора не подойдет. Есть идеи о динанамическом создании свойст у класса. Реально ли это сделать?
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37382055
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mast, а ты создвай два DP . в первое будешь биндить своё "нло" , во втором будет значение,которое ты получаешь из этого "нло" по хитрому алгоритму.

твой нынешний протокол взаимодействия слишком тухлый.
и не понятно, этот кусок xaml вносит новый контрол <TextBox Text="{Binding SystemName}" /> или вносит только связку {Binding SystemName} ? у тебя тут слова противоречят примеру.

так, что предлагаю, тебе протокол взаимодействия сделать нормальным, не вызывающий вопросов об адекватности. а потом похоже все само решится.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37382153
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexeiK,

Тогда такой вопрос: У меня есть класс Foo, присваиваю его контексту DataContext = Foo . Можно ли переопределить в классе обращения к свойствам класса? Для того чтобы при обращении через биндинг к свойсту <TextBox Text="{Binding SystemName}" /> я возвращал по имени свойства, какие либо значения.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37382220
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mast67,

чето второе предложение было не по-русски написано. я не понял вопроса поэтому.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37382371
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexeiK,
Можно ли во время выполнения программы добавить классу свойства, Foo.AddProperty(string PropertyName, object PropertyValue) ?
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37382491
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну. reflection этому может помочь. но токо обломишься, если будешь делать для скомпилированного класса. а если вот заново создаешь класс со всеми свойствами и т.д. то сработает.

слушай, ты завершай со своим тухлым протоколом общения прилолжения и плагинов. видишь в какие потуги ты уже залез.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37382748
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для динамического добавления свойст есть DynamicObject & Expando, reflection'у давно уже пора в сад.
Но непонятно, что ты будешь связывать в динамике, здается мне, что ты сам не понимаешь, что тебе нужно, если не можешь внятно сформулировать вопрос.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37385087
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVa,

DynamicObject & Expando при биндинге не работает.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37385175
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mast67SeVa,

DynamicObject & Expando при биндинге не работает.

Инетерсная новость. У меня весь фрейворк на этом построен
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37385389
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVa,

SL 4?
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37385619
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал в итоге все вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
public static class DataSourceCreator
    {
        private static readonly Regex PropertNameRegex =
                new Regex(@"^[A-Za-z]+[A-Za-z1-9_]*$", RegexOptions.Singleline);

        private static readonly Dictionary<string, Type> _typeBySigniture = new Dictionary<string, Type>();


        public static object CreatePropertyFromDictionary(this IDictionary list)
        {

            string typeSigniture = GetTypeSigniture(list);

            Type objectType = GetTypeByTypeSigniture(typeSigniture);
            
            if (objectType == null)
            {
                TypeBuilder tb = GetTypeBuilder(typeSigniture);

                ConstructorBuilder constructor =
                            tb.DefineDefaultConstructor(
                                        MethodAttributes.Public |
                                        MethodAttributes.SpecialName |
                                        MethodAttributes.RTSpecialName);


                foreach (DictionaryEntry pair in list)
                {
                    if (PropertNameRegex.IsMatch(Convert.ToString(pair.Key), 0))
                    {
                        CreateProperty(tb,
                                        Convert.ToString(pair.Key),
                                       pair.Value.GetType());

                    }
                    else
                    {
                        throw new ArgumentException(
                                    @"Each key of IDictionary must be 
                                alphanumeric and start with character.");
                    }
                }
                objectType = tb.CreateType();
            }

            return GeneratePropertyType(objectType, list);
        }

        private static Type GetTypeByTypeSigniture(string typeSigniture)
        {
            Type type;
            return _typeBySigniture.TryGetValue(typeSigniture, out type) ? type : null;
        }

        private static Type GetValueType(object value)
        {
            return value == null ? typeof(object) : value.GetType();
        }

        private static string GetTypeSigniture(IDictionary firstDict)
        {
            StringBuilder sb = new StringBuilder();
            foreach (DictionaryEntry pair in firstDict)
            {
                sb.AppendFormat("_{0}_{1}", pair.Key, GetValueType(pair.Value));
            }
            return sb.ToString().GetHashCode().ToString().Replace("-", "Minus");
        }



        private static object GeneratePropertyType(
                Type objectType, IDictionary DtypeDict)
        {
            var row = Activator.CreateInstance(objectType);

            foreach (DictionaryEntry pair in DtypeDict)
            {

                PropertyInfo property =
                    objectType.GetProperty(Convert.ToString(pair.Key));
                property.SetValue(
                    row,
                    Convert.ChangeType(
                            DtypeDict[pair.Key],
                            property.PropertyType,
                            null),
                    null);

            }
            return row as Object;
        }


        private static TypeBuilder GetTypeBuilder(string typeSigniture)
        {
            AssemblyName an = new AssemblyName("TempAssembly" + typeSigniture);
            AssemblyBuilder assemblyBuilder =
                AppDomain.CurrentDomain.DefineDynamicAssembly(
                    an, AssemblyBuilderAccess.Run);
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");

            TypeBuilder tb = moduleBuilder.DefineType("TempType" + typeSigniture
                                , TypeAttributes.Public |
                                TypeAttributes.Class |
                                TypeAttributes.AutoClass |
                                TypeAttributes.AnsiClass |
                                TypeAttributes.BeforeFieldInit |
                                TypeAttributes.AutoLayout
                                , typeof(object));
            return tb;
        }

        private static void CreateProperty(
                        TypeBuilder tb, string propertyName, Type propertyType)
        {
            FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName,
                                                        propertyType,
                                                        FieldAttributes.Private);


            PropertyBuilder propertyBuilder =
                tb.DefineProperty(
                    propertyName, PropertyAttributes.HasDefault, propertyType, null);
            MethodBuilder getPropMthdBldr =
                tb.DefineMethod("get_" + propertyName,
                    MethodAttributes.Public |
                    MethodAttributes.SpecialName |
                    MethodAttributes.HideBySig,
                    propertyType, Type.EmptyTypes);

            ILGenerator getIL = getPropMthdBldr.GetILGenerator();

            getIL.Emit(OpCodes.Ldarg_0);
            getIL.Emit(OpCodes.Ldfld, fieldBuilder);
            getIL.Emit(OpCodes.Ret);

            MethodBuilder setPropMthdBldr =
                tb.DefineMethod("set_" + propertyName,
                  MethodAttributes.Public |
                  MethodAttributes.SpecialName |
                  MethodAttributes.HideBySig,
                  null, new Type[] { propertyType });

            ILGenerator setIL = setPropMthdBldr.GetILGenerator();

            setIL.Emit(OpCodes.Ldarg_0);
            setIL.Emit(OpCodes.Ldarg_1);
            setIL.Emit(OpCodes.Stfld, fieldBuilder);
            setIL.Emit(OpCodes.Ret);

            propertyBuilder.SetGetMethod(getPropMthdBldr);
            propertyBuilder.SetSetMethod(setPropMthdBldr);
        }
    }
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37385665
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mast67SeVa,

SL 4?

Binding DynamicObject в SL 4 через идексируемые свойства, в SL 5 c CustomTypeDescriptor будет еще лучше, чем в WPF c DynamicObject.
Реализации с reflection весьма тормознутые и в SL 5 в них не будет никакого смысла.
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37385701
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVa,
авторBinding DynamicObject в SL 4 через идексируемые свойства,

Можно поподробнее?
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37385918
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерная заготовка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
using System.Dynamic;
using System.ComponentModel;

public class DynamicViewModel : DynamicObject, INotifyPropertyChanged
{
     private readonly IDictionary<string, object> properties = new Dictionary<string, object>();

     //необходим для binding'a в xaml
     public object this [string index]
     {
          get
          {
               object result;
               properties.TryGetValue(index, out result);
               return result;
          }
          set { properties[index] = value; RaisePropertyChanged(index); }
     }

/*
    TryGetMember 
            ...............

     TrySetMember
           .......... 

*/
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public TestView : UserControl

public TestView()
{
    //..........
    var vm = new DynamicViewModel();
    vm.Title = "bla-bla-bla"; 
    vm.OtherField = "Other";
    this.DataContext = vm;
}

Код: plaintext
1.
2.
3.
4.
5.
6.
               <StackPanel >
                    <!-- в SL 5 <ContentPresenter Content="{Binding Title}"/> ->
                    <ContentPresenter Content="[Title]"/>
                    <ContentPresenter Content="[OtherField]"/>
               </StackPanel>
        
...
Рейтинг: 0 / 0
Silverlight binding вопрос
    #37386150
mast67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVa,

Спасибо, буду знать, в SL 5 выглядит поинтереснее.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Silverlight binding вопрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]