Синхронизировать UIControls с настройками [duplicate]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.

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

3 ответа

Во-первых, вам нужно добавить собственное пространство имен 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

106
ответ дан hon2a 28 August 2018 в 09:18
поделиться

@ Ответ CSharper не работает для моего приложения WPF, закодированного в VB.NET (не C #, в отличие от, видимо, 99.999% других приложений WPF), так как я получил постоянную ошибку компилятора, жалуясь, что Settings не найден в MyApp.Properties namespace, которое не исчезло бы даже после восстановления.

Что вместо меня работало после многократного поиска в Интернете, вместо этого использовало пространство имен local XAML, созданное по умолчанию в главном окне приложения XAML-файл:

<Window
    <!-- Snip -->
    xmlns:local="clr-namespace:MyApp"
    <!-- Snip -->
><!-- Snip --></Window>

... и привязать к моим настройкам через него, используя что-то вроде следующего (где MyBooleanSetting - это параметр, который я определил в своих свойствах проекта типа Boolean и области пользователя , с модификатором доступа Friend по умолчанию):

<CheckBox IsChecked="{Binding Source={x:Static local:MySettings.Default}, Path=MyBooleanSetting, Mode=TwoWay}"
          Content="This is a bound CheckBox."/>

Чтобы убедиться, что настройки действительно сохранены, обязательно вызовите

MySettings.Default.Save()

... где-то в вашем коде (например, в событии Me.Closing для вашего файла MainWindow.xaml.vb).

(Подчините этому сообщению форума Visual Studio для вдохновения; см. ответ на Мухаммад Сиддики.)

5
ответ дан Christopher Kyle Horton 28 August 2018 в 09:18
поделиться

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

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

Вот код для этого расширение:

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 -расширение /

25
ответ дан Thomas Levesque 28 August 2018 в 09:18
поделиться
Другие вопросы по тегам:

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