Soru WPF özelliklerini C # içinde ApplicationSettings'e bağlamak için en iyi yol?


WPF özelliklerini C # içindeki ApplicationSettings ile ilişkilendirmenin en iyi yolu nedir? Windows Forms uygulamasında olduğu gibi otomatik bir yolu var mı? Benzer bu soruWPF'de aynı şeyi nasıl yapıyorsunuz (ve nasıl mümkün olabilir)?


44
2017-09-30 19:20


Menşei




Cevaplar:


Visual Studio tarafından oluşturulan statik nesneyi doğrudan bağlayabilirsiniz.

Windows bildiriminde ekleyin:

xmlns:p="clr-namespace:UserSettings.Properties"

nerede UserSettings uygulama ad alanıdır.

Sonra doğru ayarlara bir ciltleme ekleyebilirsiniz:

<TextBlock Height="{Binding Source={x:Static p:Settings.Default}, 
           Path=Height, Mode=TwoWay}" ....... />

Şimdi, örneğin, uygulamanızı kapattığınızda ayarları kaydedebilirsiniz:

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    Properties.Settings.Default.Save();
    base.OnClosing(e); 
}

96
2017-11-05 00:08



Ben şaşırdım TwoWay Bağlama aslında her iki şekilde de çalışır. Güzel. +1 - Adam Badura
Orada arama yapanlara not, TwoWay GEREKLİ veya ayarlar kaydedilmeyecek. Bunu denemek ve anlamak için can sıkıcı. - Will
Biraz farklı bir sözdizimi (ve iyi bir intro) için, oku blogs.msdn.com/b/patrickdanino/archive/2008/07/23/... - Pat
Bu, sorulan soruya verilen mükemmel bir yanıt olsa da, ciltleme işleminin düzenleme ayarlarının Araçlar / Seçenekler iletişim stili için doğru cevap olmadığını buldum; Widget değerlerini kullanıcı OK tuşuna basana kadar özellikleri kopyalamak istemezsiniz. Tamam tıklatma işleyicisinde bunu yapmak için açık kod kullanmak, İptal düğmesinin sağlanan bir işleyiciye gerek duymadığı anlamına gelir IsCancel == true - Peter Wone
@PeterWindowsSettings.Default.Save () 'i okumakta olduğum ayarlardan yararlanmaya gerek duyduğunuzda, özellik düzenleme iletişim kutusundaki İptal eylemindeki senaryonuzda, Properties.Settings.Default.Reload ( ) [ve tamam da Kaydet'i arayacaksınız] - George Birbilis


Eğer siz iseniz VB.Net bunu deneyen geliştirici, cevap farklı bir smidge.

xmlns:p="clr-namespace:ThisApplication"

.Properties orada değil dikkat edin.


Bağlandığınızda, app.config onu farklı şekilde depoladığından, Settings.Default yerine MySettings.Default olur.

<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ...

Saçımı çekip çıkardıktan sonra bunu keşfettim. Umarım yardımcı olur


8
2018-02-10 17:39





Kabul edilen cevabı beğenirim, yine de özel bir davaya koştum. Metin kutumu sadece "salt okunur" olarak ayarladım, böylece yalnızca kodunu kodda değiştirebilirim. Mode'u "TwoWay" olarak seçmeme rağmen neden değerin Ayarlar'a yayılmadığını anlayamadım.

Sonra şunu buldum: http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

Varsayılan değer, hedef bağımlılık özelliğinin varsayılan UpdateSourceTrigger değerini döndürür. Ancak, çoğu bağımlılık özelliği için varsayılan değer PropertyChanged'dir. Text özelliği, varsayılan bir LostFocus değerine sahiptir.

Bu nedenle, IsReadOnly = "True" özelliğine sahip bir metin kutusu varsa, Binding deyimine bir UpdateSourceTrigger = PropertyChanged değeri eklemeniz gerekir:

<TextBox Text={Binding Source={x:Static p:Settings.Default}, Path=myTextSetting, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} ... />

7
2017-10-19 20:24



En iyi uygulama bu şekilde yapmak, imho. - Will


En kolay yol, uygulama ayarlarınızı özellik olarak gösteren veya bu nesneyi StaticResource olarak ekleyen ve buna bağlanan bir nesneyi bağlamaktır.

Yapabileceğiniz başka bir yön, kendi yaratıcılığınızdır. İşaretleme Uzantısı bu yüzden sadece PropertyName = "{ApplicationSetting SomeSettingName}" kullanabilirsiniz. Özel bir işaret uzantısı oluşturmak için miras almanız gerekir MarkupExtension ve sınıfı bir MarkupExtensionReturnType bağlıyor. John Bowen bir var Özel bir MarkupExtension oluşturmaya gönder Bu süreci biraz daha açık hale getirebilir.


5
2017-10-01 09:25





Kris, bunun ApplicationSettings'i bağlamanın en iyi yolu olduğundan emin değilim, ama ben de bunu yaptım. Esprili.

1) Pencere / sayfa / usercontrol / kapsayıcısında bağlamak istediğiniz ayar için bir bağımlılık özelliği oluşturun. Bu durumda ses çalmak için bir kullanıcı ayarım var.

    public bool PlaySounds
    {
        get { return (bool)GetValue(PlaySoundsProperty); }
        set { SetValue(PlaySoundsProperty, value); }
    }

    public static readonly DependencyProperty PlaySoundsProperty =
        DependencyProperty.Register("PlaySounds", typeof(bool), typeof(Options),
        new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnPlaySoundsChanged)));

    private static void OnPlaySoundsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        Properties.Settings.Default.PlaySounds = (bool)args.NewValue;
        Properties.Settings.Default.Save();
    }

2) Yapıcıda, uygulama ayarlarını eşleştirmek için özellik değerini başlangıç ​​durumuna getirin.

      PlaySounds = Properties.Settings.Default.PlaySounds;

3) XAML'deki özelliği bağlayın

      <CheckBox Content="Play Sounds on new Tweets" x:Name="PlaySoundsCheckBox" IsChecked="{Binding Path=PlaySounds, ElementName=Window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

Tam indirebilirsiniz Esprili kaynak eylemde görmek ya da sadece göz atmak seçenekler penceresi için kod.


3
2017-09-30 23:30



sasha yöntemi (diğer cevaba bakınız) daha kısadır - decasteljau
Uhhh, 100'den fazla ayarınız olduğunda ne olur? :O - James M


Bunu ViewModel aracılığıyla yapmayı ve XAML'de normal ciltlemeyi yapmayı seviyorum.

    public Boolean Value
    {
        get
        {
            return Settings.Default.Value;

        }
        set
        {
            Settings.Default.SomeValue= value;
            Settings.Default.Save();
            Notify("SomeValue");
        }
    }

2
2017-07-01 15:17



Çoğu durumda bunun en iyi çözüm olduğunu düşünüyorum çünkü tutarlılığı zorluyor. UI için, değer Ayarlar'dan veya başka bir yerden gelirse, hiçbir fark yoktur. - Florian


Ayrıca okumak bu BabySmash'da nasıl yapıldığına dair makale

Değişiklik bildirimine ihtiyacınız varsa, sadece Ayarları DO (Alan'ın örneği gibi) ile geri almanız gerekir! POCO Settings sınıfına bağlanma da işe yarayacaktır!


0
2017-10-01 06:50