从设置文件加载属性时,我遇到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;
}
}
}