Динамический диалог и описание связи элементов
От: Аноним  
Дата: 28.01.11 15:44
Оценка:
Диалог конструируется на лету, в базе есть описание названий полей и их типа ( текст, дата, крыжик и т.п. ) — по сути тип контрола ( TextBox, CheckBox ).

Нужно добавить также описание связи между элементами, например :
— зависимость видимости некоторых полей от состояния крыжика или combobox,
— граничные значения также в зависимости от других значений.
— обязательные поля ( в зависимости от состояния поле может стать не обязательным для заполнения )


Т.е. нужна некая семантика для описания динамических валидаторов и видимости.
Скорее всего это описание будет хранится дополнительной колонкой в БД в виде строки, но не исключаю и другие способы.

Как это лучше сделать на wpf ? Есть ли какие-то наработки в этой технологии облегчающие задачу или нужно что-то придумать самому.
Re: Динамический диалог и описание связи элементов
От: Visor2004  
Дата: 28.01.11 15:56
Оценка:
Здравствуйте, Аноним, Вы писали:

Я хз, что такое крыжик, но если речь идет о стандартных контролах, то надо смотреть в сторону ItemsControl и DataTemplateSelector
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: Динамический диалог и описание связи элементов
От: HowardLovekraft  
Дата: 28.01.11 18:12
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Я хз, что такое крыжик

Полагаю, чекбокс.
Re[2]: Динамический диалог и описание связи элементов
От: Аноним  
Дата: 28.01.11 18:16
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


V>Я хз, что такое крыжик, но если речь идет о стандартных контролах, то надо смотреть в сторону ItemsControl и DataTemplateSelector


DataTemplateSelector не совсем то что нужно, т.к. он кодируется жестко, возможно я что-то еще не вкусил из его способов использования.
А именно как DateTemplateSelector описать в том же Xaml, например что при выборе значения = 1 , определенные контролы должны стать Enabled = false.

Допустим на условия Enable/Disable будут описаны триггеры в XML и сохранены в базе данных. При динамическом создании триггеры будут подтягиваться из базы.
Вот почему-то такой триггер не срабатывает. Точнее валится с ошибкой — просит переделать на EventTrigger, а мне нужен как раз по Condition, в Event триггерах не нашел условия запуска.

        <ComboBox Name="cb1">
            <ComboBoxItem>1</ComboBoxItem>
            <ComboBoxItem>2</ComboBoxItem>
        </ComboBox>
        
        
        <TextBox Name="tb1" Text="Текст1" >
            <TextBox.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition SourceName="cb1" Property="ComboBox.SelectedIndex" Value="1"></Condition>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="TextBox.IsEnabled" TargetName="tb1" Value="false"></Setter>
                        </MultiDataTrigger>
            </TextBox.Triggers>
        </TextBox>
Re[3]: Динамический диалог и описание связи элементов
От: Visor2004  
Дата: 28.01.11 20:20
Оценка:
Здравствуйте, Аноним, Вы писали:

DataTemplateSelector, не sealed, а значит от него можно наследоваться и навернуть там любую, сколь угодно сложную логику выбора шаблона, вплоть до райнтайм генерации шаблона по переданному объекту ( только если полная безнадега такое можно делать ).
По поводу вашего кода, напрямую к элементу можно прицепить только EventTrigger, остальные типы триггеров доступны только из стилей и шаблонов. Я не зря кинул ссылку на DataTemplateSelector, изучите внимательно, что он предлагает и я думаю вы решите свою проблему.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[4]: Динамический диалог и описание связи элементов
От: Аноним  
Дата: 29.01.11 17:16
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


V>DataTemplateSelector, не sealed, а значит от него можно наследоваться и навернуть там любую, сколь угодно сложную логику выбора шаблона, вплоть до райнтайм генерации шаблона по переданному объекту ( только если полная безнадега такое можно делать ).

V>По поводу вашего кода, напрямую к элементу можно прицепить только EventTrigger, остальные типы триггеров доступны только из стилей и шаблонов. Я не зря кинул ссылку на DataTemplateSelector, изучите внимательно, что он предлагает и я думаю вы решите свою проблему.

Все таки не совсем понятно , DataTemplate применим к ItemsControl, в случае динамического диалога нет ItemsControlа, просто все контролы размещаются в Grid. В базе прописаны координаты в сетке для textbox, checkbox и т.д. к которым DataTemplate также нельзя применить.
Re[5]: Динамический диалог и описание связи элементов
От: Visor2004  
Дата: 29.01.11 18:46
Оценка:
Здравствуйте, Аноним, Вы писали:

public PropertyViewModel
{
   public PropertyViewModel ( PropertyInfo property, object target ) { /* устанавливаем Value и ValueType */
   public object Value { get; set; }
   public Type ValueType { get; set; }
}

public ObjectViewModel
{
   public IEnumerable<PropertyViewModel> Properties { get; internal set; }
}

......

var obj = Database.GetObject ( ... );
var viewModel = new ObjectViewModel
{
  Properties = obj.GetType().GetProperties ( BindingFlags.Instance | BindingFlags.Public ).Select ( a => new PropertyViewModel ( a, obj ) );
}

.....

public TemplateSelector : DataTemplateSelector
{
   IDictionary<string, DataTemplate> templates = new Dictionary<string, DataTemplate>();

   public override SelectTemplate ( DependencyObject control, object value )
   {
      return templates [( value as PropertyViewModel ).ValueType.Name];
   }

   public DataTemplate StringTemplate
   {
     get { return templates["System.string"]; }
     set { templates["System.string"] = value; }
   }
}

....



<UserControl.Resources>
  <DataTemplate x:Key="StringTemplate">
    <TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger = PropertyChanged}"/>
  </DataTemplate>
  <TemplateSelector x:Key="selector" StringTemplate="{StaticResource StringTemplate}"/>
</UserControl.Resources>

<Grid>
  <ItemsControl ItemsSource = "{Binding viewModel.Properties}" DataTemplateSelector = "{StaticResource selector}"/>
</Grid>


По аналогии с остальными типами полей.
Помните!!! ваш говнокод кому-то предстоит разгребать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.