L'utente seleziona qualcosa in combobox, qualcos'altro viene inviato alla proprietà di dipendenza

StackOverflow https://stackoverflow.com/questions/2287190

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 :

  1. l'utente seleziona "Gennaio 15", così la proprietà di dipendenza è impostata su "m".
  2. 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.

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top