В WPF, могу ли я использовать привязку со значениями, определенными в настройках? Если это возможно, просьба указать образец.Привязать к значению, определенному в настройках
ответ
Во-первых, вам нужно добавить пользовательские 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 - How to bind a control to a property defined in the Settings?
Примечание: Как было отмечено @Daniel и @nabulke, не забудьте установить Модификатор доступа вашего файла настроек в Public
и Scope в User
Раствор, выше работает, но я нахожу это довольно подробным ... вместо этого вы можете использовать собственное расширение разметки, которое может быть использовано следующим образом:
<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-extension/
Ницца, ... хорошее расширение. – Stimul8d
Это отличное расширение, но, к сожалению, вы теряете Resharper intellisense. Не стоит компромисс ИМХО, хотя следует отметить, что я безнадежный поклонник R # :) –
@OhadSchneider, действительно. Я использую ReSharper сам, но редко для XAML, потому что я не считаю его хорошим, как в C# ... –
@ ответ CSharper не работал для моего приложения WPF, закодированной в VB.NET (не C#, в отличие от очевидно 99,999% других приложений WPF), так как я получил постоянную ошибку компилятора, жалуясь на то, что Settings
не удалось найти в пространстве имен MyApp.Properties
, которое не исчезнет даже после перестройки.
То, что сработало, а не для меня, после долгих поисков в Интернете, был вместо этого использовать пространство имен 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 forum post за вдохновение, см. Ответ Мухаммада Сиддики.)
Я обнаружил, что этот метод работает только в том случае, если файл настроек отмечен как модификатор общедоступного доступа. http://shortfastcode.blogspot.com/2009/12/binding-to-settings-file.html – Daniel
Чтобы сохранить значение с помощью 'MyApp.Properties.Settings.Default.Save()', область настройки должна установите ** Пользователь **. – nabulke