설정에 정의 된 값에 바인딩


78

WPF에서 설정에 정의 된 값으로 바인딩을 사용할 수 있습니까? 가능하다면 샘플을 제공해주세요.

답변:


130

먼저 설정이 정의 된 네임 스페이스를 디자인 할 사용자 지정 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하고 범위 를 다음으로 설정 하는 것을 잊지 마십시오.User


11
이 방법은 설정 파일이 공개 액세스 수정 자로 표시된 경우에만 작동한다는 것을 발견했습니다. shortfastcode.blogspot.com/2009/12/…
Daniel

5
를 사용하여 값을 저장하려면 MyApp.Properties.Settings.Default.Save()설정 범위를 User 로 설정해야 합니다.
nabulke

31

위의 솔루션은 작동하지만 매우 장황하다는 것을 알았습니다. 대신 사용자 정의 마크 업 확장을 사용할 수 있습니다. 다음과 같이 사용할 수 있습니다.

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


1
이것은 훌륭한 확장이지만 불행히도 Resharper intellisense를 잃습니다. 내가 :) 희망 R 번호의 팬보이임을 주목해야한다 불구하고 트레이드 오프 이럴 가치되지 않음
오핫 슈나이더

@OhadSchneider, 참으로. 내가 ... C #에서 좋은으로 찾을 수없는 때문에, 드물게 XAML에 대한, ReSharper에서 나 자신을 사용
토마스 레베

8

@CSharper의 대답은 VB.NET으로 코딩 된 내 WPF 응용 프로그램에서 작동하지 않았습니다 (다른 WPF 응용 프로그램의 99.999 %와 달리 C # Settings이 아님).MyApp.Properties 가지 않을 것이다, 네임 스페이스 재건 후에도 멀리 떨어져 있습니다.

온라인에서 많은 검색을 한 후 대신 local내 응용 프로그램의 기본 창 XAML 파일에서 기본적으로 생성 된 XAML 네임 스페이스 를 대신 사용하는 것이 효과적 이었습니다 .

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

... 다음과 같은 방법을 사용하여 내 설정에 바인딩합니다 (여기서는 기본 Friend 액세스 수정자를 사용하여 사용자 MyBooleanSetting유형 Boolean및 범위 의 프로젝트 속성에 정의한 설정 ).

<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 포럼 게시물 에서 영감을 얻었습니다. Muhammad Siddiqi의 답변을 참조하십시오.)


0

UserSettings를 바인딩하는 방법은 다음과 같습니다.

입력 propdp하고 두 번 탭 하여 종속성 변수를 생성하십시오 .

    public UserSettings userSettings
    {
        get { return (UserSettings)GetValue(userSettingsProperty); }
        set { SetValue(userSettingsProperty, value); }
    }
    public static readonly DependencyProperty userSettingsProperty =
        DependencyProperty.Register("userSettings", typeof(UserSettings), typeof(MainWindow), new PropertyMetadata(UserSettings.Default));

이제 다음과 같이 바인딩 할 수 있습니다 userSettings.

Value="{Binding userSettings.SomeUserSettingHere, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

UserSettings를 변경하거나 종료 할 때 다음을 수행하여 저장해야합니다.

UserSettings.Default.Save();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.