L'utente seleziona qualcosa in combobox, qualcos'altro viene inviato alla proprietà di dipendenza
-
21-09-2019 - |
Domanda
Nella mia applicazione l'utente può selezionare la modalità di visualizzazione una data. La maggior parte della stringhe di formato standard, datetime possono essere selezionato. Il mio problema ora è che l'utente medio doesnt capire la differenza tra "m" e "D". Quello che voglio fare è cambiare questo in modo che, come fa excel, piuttosto che mostrare la stringa di formato, mostro come una data arbitraria sarebbe simile utilizzando tale formato.
Il combobox SelectedItem WPF è associato a una proprietà di dipendenza nei clas raccoglitrice formato data, che l'altro controllo contenente questa selezione data anche lega al.
Esempio :
- l'utente seleziona "Gennaio 15", così la proprietà di dipendenza è impostata su "m".
- Tramite il codice dietro, il valore della proprietà di dipendenza è impostato su "D", la casella combinata viene aggiornata per visualizzare "Giovedi, 15 ° gennaio 1970", come l'elemento selezionato.
Ho provato ad utilizzare convertitori ma ConvertBack era impossibile in quanto non posso estrarre una stringa di formato utilizzato per creare una certa data.
Soluzione
È possibile creare un DateFormatChoice
classe che contiene una proprietà per il codice di formato (ad esempio, "m" o "D") e una proprietà per la data corrente formattata in questo modo.
public class DateFormatChoice {
public string FormatCode { get; private set; }
public string CurrentDateExample {
get { return DateTime.Now.ToString( FormatCode ) }
}
public DateFormatChoice( string standardcode ) {
FormatCode = standardcode;
}
}
Si associa la tua casella combinata a una collezione di questi utilizzando CurrentDateExample
o nel vostro DataTemplate
o come DisplayMemberPath
del ComboBox. È possibile utilizzare questi oggetti direttamente con il formato della data classe selettore e la DatePicker
si lega alla proprietà FormatCode
dell'oggetto DateFormatChoice
prescelto, oppure è possibile impostare la proprietà ValueMemberPath
sul ComboBox originale alla proprietà FormatCode
e utilizzare SelectedValue
sul ComboBox per ottenere / impostazione quello che viene scelto. Non usando ValueMember
potrebbe essere un po 'più facile.
Ecco un esempio più completo. Esso utilizza la classe DateFormatChoice
sopra.
In primo luogo, una raccolta di dati.
public class DateFormatChoices : List<DateFormatChoice> {
public DateFormatChoices() {
this.Add( new DateFormatChoice( "m" ) );
this.Add( new DateFormatChoice( "d" ) );
this.Add( new DateFormatChoice( "D" ) );
}
}
Poi ho fatto semplice ViewModel per la finestra:
public class ViewModel : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged = ( s, e ) => {
}; // the lambda ensures PropertyChanged is never null
public DateFormatChoices Choices {
get;
private set;
}
DateFormatChoice _chosen;
public DateFormatChoice Chosen {
get {
return _chosen;
}
set {
_chosen = value;
Notify( PropertyChanged, () => Chosen );
}
}
public DateTime CurrentDateTime {
get {
return DateTime.Now;
}
}
public ViewModel() {
Choices = new DateFormatChoices();
}
// expression used to avoid string literals
private void Notify<T>( PropertyChangedEventHandler handler, Expression<Func<T>> expression ) {
var memberexpression = expression.Body as MemberExpression;
handler( this, new PropertyChangedEventArgs( memberexpression.Member.Name ) );
}
}
non ho avuto un controllo selezione data che ha accettato i codici di formato stringa standard, così ho fatto un controllo utente abbastanza muto (con molti angoli tagliati) solo per dimostrare la sua ricezione del codice del formato. Ho dato una proprietà di dipendenza chiamato DateFormatProperty
di tipo string
e specificato un callback cambiato valore nel UIPropertyMetadata
.
<Grid>
<TextBlock Name="datedisplayer" />
</Grid>
Il callback:
private static void DateFormatChanged( DependencyObject obj, DependencyPropertyChangedEventArgs e ) {
var uc = obj as UserControl1;
string code;
if ( null != ( code = e.NewValue as string ) ) {
uc.datedisplayer.Text = DateTime.Now.ToString( code );
}
}
E questo è come ho legato tutto insieme nella finestra.
<StackPanel>
<StackPanel.DataContext>
<local:ViewModel />
</StackPanel.DataContext>
<ComboBox
ItemsSource="{Binding Choices}" DisplayMemberPath="CurrentDateExample"
SelectedItem="{Binding Chosen, Mode=TwoWay}"/>
<local:UserControl1
DateFormatProperty="{Binding Chosen.FormatCode}" />
</StackPanel>