Свяжите со значением, определенным в Настройках

Переменные в рекордере действительно масштабируются дважды. В драйвере значения масштабируются правильно. Вы можете сравнить его для последнего случая с кодом ниже. Масштабирование выполняется в _apply_voi_meta() в классе Case.

#%%

cr = CaseReader('abc.sql')
case_keys = cr.list_cases()
obj=[]
for i, case_key in enumerate(case_keys):
    case = cr.get_case(case_key)
    derivs = cr.get_case(i).jacobian
#        for k in derivs:
#            print(k,derivs[k])

    recorded_objectives  = case.get_objectives()
    recorder_constraints = case.get_constraints()
    recorder_desvars     = case.get_design_vars()
    recorder_responses   = case.get_responses()
    for k in recorder_desvars:
        print(k,recorder_desvars[k])
    for k in recorder_constraints:
        print(k,recorder_constraints[k])
    for k in recorded_objectives:
        print(k,recorded_objectives[k])
        obj.append(recorded_objectives[k])

    print('-----------')

print('\nDRIVER:\n\n')

for k, v in iteritems(driver.get_design_var_values()):
    print(k, v)
for k, v in iteritems(driver.get_constraint_values()):
    print(k, v)
for k, v in iteritems(driver.get_objective_values()):
    print(k, v)

Теперь ясно, что источником проблемы является рекордер. В вашем случае вы вызываете и методы get_constraints() и get_responses() для случая. В этих методах изменяемые переменные масштабируются. Поэтому, когда вы возвращаете значение, переменная vals в _apply_voi_meta() также масштабируется. Сколько раз вы вызываете любую функцию, которая масштабирует одни и те же переменные, переменные будут масштабироваться при каждом вызове функции как побочный эффект.

См. Пример ниже:

#%%

cr = CaseReader('abc.sql')
case_keys = cr.list_cases()
obj=[]

scaled = True

for i, case_key in enumerate(case_keys):
    case = cr.get_case(case_key)
    derivs = cr.get_case(i).jacobian
#        for k in derivs:
#            print(k,derivs[k])

    recorded_objectives  = case.get_objectives(scaled=scaled)
    recorder_constraints = case.get_constraints(scaled=scaled)
    recorder_desvars     = case.get_design_vars()
    # recorder_responses   = case.get_responses(scaled=scaled)

    case.get_constraints(scaled=scaled)
    case.get_constraints(scaled=scaled)

    for k in recorder_desvars:
        print(k,recorder_desvars[k])
    for k in recorder_constraints:
        print(k,recorder_constraints[k])
    for k in recorded_objectives:
        print(k,recorded_objectives[k])
        obj.append(recorded_objectives[k])

    print('-----------')

print('\nDRIVER:\n\n')

for k, v in iteritems(driver.get_design_var_values()):
    print(k, v)
for k, v in iteritems(driver.get_constraint_values()):
    print(k, v)
for k, v in iteritems(driver.get_objective_values()):
    print(k, v)

Если масштабатор равен 10, ограничение будет в 1000 (или 10 ^ 3) раз больше немасштабированного значения, потому что теперь я вызывал метод get_constraints() 3 раза .

72
задан H.B. 22 August 2013 в 19:53
поделиться

2 ответа

Во-первых, вам нужно добавить настраиваемое пространство имен XML, которое будет спроектировать пространство имен, в котором определены параметры:

xmlns:properties="clr-namespace:TestSettings.Properties"

Затем в вашем файле XAML перейдите к экземпляру настроек по умолчанию, используя следующий синтаксис :

{x:Static properties:Settings.Default}

Итак, вот окончательный код результата:

<ListBox x:Name="lb"
         ItemsSource="{Binding Source={x:Static properties:Settings.Default},
                               Path=Names}" />

Источник: WPF - Как привязать элемент управления к свойству, определенному в Настройках?


Примечание. Как указано @Daniel и @nabulke, не забудьте установить Модификатор доступа вашего файла настроек на Public и Scope на User

122
ответ дан 24 November 2019 в 12:36
поделиться

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

<ListBox x:Name="lb" ItemsSource="{my:SettingBinding Names}" />

Вот код для этого extension:

public class SettingBindingExtension : Binding
{
    public SettingBindingExtension()
    {
        Initialize();
    }

    public SettingBindingExtension(string path)
        :base(path)
    {
        Initialize();
    }

    private void Initialize()
    {
        this.Source = WpfApplication1.Properties.Settings.Default;
        this.Mode = BindingMode.TwoWay;
    }
}

Подробнее здесь: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/

29
ответ дан 24 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: