Типичным объявлением переменной является
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)
Другие примеры несоответствий включают
Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.
Во-первых, вам нужно добавить собственное пространство имен 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
@ Ответ 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 для вдохновения; см. ответ на Мухаммад Сиддики.)
Решение выше работает, но я нахожу его довольно подробным ... вместо этого вы можете использовать собственное расширение разметки, которое можно использовать следующим образом:
<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 -расширение /