2009-05-10 3 views

ответ

103

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

+7

Я обнаружил, что этот метод работает только в том случае, если файл настроек отмечен как модификатор общедоступного доступа. http://shortfastcode.blogspot.com/2009/12/binding-to-settings-file.html – Daniel

+2

Чтобы сохранить значение с помощью 'MyApp.Properties.Settings.Default.Save()', область настройки должна установите ** Пользователь **. – nabulke

24

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

<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/

+0

Ницца, ... хорошее расширение. – Stimul8d

+0

Это отличное расширение, но, к сожалению, вы теряете Resharper intellisense. Не стоит компромисс ИМХО, хотя следует отметить, что я безнадежный поклонник R # :) –

+0

@OhadSchneider, действительно. Я использую ReSharper сам, но редко для XAML, потому что я не считаю его хорошим, как в C# ... –

4

@ ответ 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 за вдохновение, см. Ответ Мухаммада Сиддики.)

 Смежные вопросы

  • Нет связанных вопросов^_^