MVVM Light UI在加载设置时不会更新

时间:2016-07-23 08:20:30

标签: c# wpf xaml mvvm data-binding

从设置文件加载属性时,我遇到UI未更新的问题。在代码下方显示,我为荷兰属性名称道歉,翻译如下:

Lade:托盘。
Papiergrootte:纸张化。
Geselecteerde:选中。
isEersteKeer:isFirstTime。

我有一个usercontrol,一个打印机组合框,视图模型代码(下面)绑定到该组件。

public class PrinterViewModel : ViewModelBase

    {

        private ObservableCollection<Printer> _printers;
        private Printer _geselecteerdePrinter;
        private ObservableCollection<Lade> _lades;
        private ObservableCollection<Papiergrootte> _papiergroottes;
        private Lade _geselecteerdeLade;
        private Papiergrootte _geselecteerdePapiergrootte;
        private bool isEersteKeer;

        public PrinterViewModel()
        {
            isEersteKeer = true;

            _printers = Printer.GetPrinters();

            LoadPrinterSettings();

            isEersteKeer = false;

        }

        public Lade GeselecteerdeLade
        {
            get { return _geselecteerdeLade; }
            set
            {
                _geselecteerdeLade = value;
                RaisePropertyChanged("GeselecteerdeLade");

                if (!isEersteKeer)
                {
                    SavePrinterSettings();
                }
            }
        }

        public Papiergrootte GeselecteerdePapiergrootte
        {
            get { return _geselecteerdePapiergrootte; }
            set
            {
                _geselecteerdePapiergrootte = value;
                RaisePropertyChanged("GeselecteerdePapiergrootte");
                if (!isEersteKeer)
                {
                    SavePrinterSettings();
                }

            }
        }

        public ObservableCollection<Lade> Lades
        {
            get { return _lades; }
            set
            {
                _lades = value;
                RaisePropertyChanged("Lades");
                if (Lades.Count > 0 && !isEersteKeer)
                {
                    GeselecteerdeLade = Lades[0];
                }
            } 
        }

        public ObservableCollection<Papiergrootte> Papiergroottes
        {
            get { return _papiergroottes; }
            set
            {
                _papiergroottes = value;
                RaisePropertyChanged("Papiergroottes");

                if (Papiergroottes.Count > 0 && !isEersteKeer)
                {
                    GeselecteerdePapiergrootte = Papiergroottes[0];
                }

            }
        }

        public ObservableCollection<Printer> Printers
        {
            get { return _printers; }
            set
            {

                _printers = value;
                RaisePropertyChanged("Printers");
            }
        }

        public Printer GeselecteerdePrinter
        {
            get { return _geselecteerdePrinter; }
            set
            {

                _geselecteerdePrinter = value;
                RaisePropertyChanged("GeselecteerdePrinter");
                Lades = _geselecteerdePrinter.Lades;
                Papiergroottes = _geselecteerdePrinter.PapierGroottes;

                if (!isEersteKeer)
                {
                    SavePrinterSettings();
                }

            }
        }

        private void SavePrinterSettings()
        {

            if (GeselecteerdePrinter != null && GeselecteerdeLade != null && GeselecteerdePapiergrootte != null)
            {
                Settings.Default.Printer1 = GeselecteerdePrinter;
                Settings.Default.Lade1 = GeselecteerdeLade;
                Settings.Default.Papiergrootte1 = GeselecteerdePapiergrootte;
                Settings.Default.Save();
            }

        }

        private void LoadPrinterSettings()
        {
            GeselecteerdePrinter = Settings.Default.Printer1;
            GeselecteerdeLade = Settings.Default.Lade1;
            GeselecteerdePapiergrootte = Settings.Default.Papiergrootte1;
        }
    }

打印机组合框的XAML:

<UserControl
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:c="clr-namespace:ControlLib.uPrinterCombo"
    xmlns:vm="clr-namespace:ControlLib.uPrinterCombo"
             xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" x:Class="ControlLib.uPrinterCombo.uPrinterCombo"
    mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"


    >
    <UserControl.Resources>
        <c:PrinterViewModel x:Key="PrinterViewModel"/>
    </UserControl.Resources>
    <UserControl.DataContext>
        <Binding Source="{StaticResource PrinterViewModel}"/>
    </UserControl.DataContext>
    <Grid>

        <ComboBox x:Name="cmbPrinters" HorizontalAlignment="Left" Margin="17,20,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Path=Printers, Mode=TwoWay}" DisplayMemberPath="Naam" SelectedItem="{Binding GeselecteerdePrinter}"/>
        <ComboBox x:Name="cmbPapierGroottes" HorizontalAlignment="Left" Margin="17,50,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Path=Papiergroottes, Mode=TwoWay}" DisplayMemberPath="Naam" SelectedItem="{Binding GeselecteerdePapiergrootte}"/>
        <ComboBox x:Name="cmbPapierLades" HorizontalAlignment="Left" Margin="17,80,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Path=Lades, Mode=TwoWay}" DisplayMemberPath="Naam" SelectedItem="{Binding GeselecteerdeLade}"/>
    </Grid>
</UserControl>

提前感谢任何想要帮助的人。我确信绑定工作正常,当我从设置中读取属性时它不起作用。

加载设置时属性发生变化,当组合框的源根据从设置加载的选定打印机进行更新时,selectedItem不会更新。

编辑:初始化集合的代码:

namespace ControlLib.uPrinterCombo
{
public class Printer : ObservableObject
{
    private string _naam;
    private ObservableCollection<Lade> _lades;
    private ObservableCollection<Papiergrootte> _papiergroottes;

    public string Naam
    {
        get { return _naam; }
        set { Set<string>(() => this.Naam, ref _naam, value); }
    }

    public ObservableCollection<Lade> Lades
    {
        get { return _lades; }
        set { Set<ObservableCollection<Lade>>(() => this.Lades, ref _lades, value); }
    }

    public ObservableCollection<Papiergrootte> PapierGroottes
    {
        get { return _papiergroottes; }
        set { Set<ObservableCollection<Papiergrootte>>(() => this.PapierGroottes, ref _papiergroottes, value); }
    }

    public static ObservableCollection<Printer> GetPrinters()
    {
        ObservableCollection<Printer> printers = new ObservableCollection<Printer>();


            PrintServer localPrintServer = new PrintServer();
        PrintQueueCollection printQueues = localPrintServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections });
        var printerQueues = (from printer in printQueues
                           select printer).ToList();
        foreach (var printerQueue in printerQueues)
        {
            Printer p = new Printer();
            XmlPrinterUtility util = new XmlPrinterUtility(printerQueue);

            ObservableCollection<Lade> lades = new ObservableCollection<Lade>();
            ObservableCollection<Papiergrootte> papiergroottes = new ObservableCollection<Papiergrootte>();

            foreach (var lade in util.GetPrinterInfo(XmlPrinterUtility.PrinterInfo.papierLade))
            {
                lades.Add(new Lade(lade.Key, lade.Value));
            }

            foreach (var papiergrootte in util.GetPrinterInfo(XmlPrinterUtility.PrinterInfo.papierGrootte))
            {
                papiergroottes.Add(new Papiergrootte(papiergrootte.Key, papiergrootte.Value));
            }

            p.Lades = lades;
            p.PapierGroottes = papiergroottes;
            p.Naam = printerQueue.Name;

            printers.Add(p);
        }
        return printers;

    }
}

}

0 个答案:

没有答案