Vra

In my aansoek die gebruiker kan kies hoe 'n datum word vertoon. Die meeste van die standaard DATETIME formaatstringe kan wees gekies. My probleem is nou dat die gemiddelde gebruiker nie die geval is die verskil tussen "m" en "D". Wat ek wil is verander dit sodat, as Excel doen, eerder as om te wys die formaat string, ek wys hoe 'n arbitrêre datum sou lyk die gebruik van daardie formaat.

doen

Die WFP comboboks SelectedItem is gebonde aan 'n afhanklikheid eiendom in die datum formaat plukker clas, wat die ander beheer met hierdie datum plukker ook bind aan.

Voorbeeld :

  1. Die gebruiker kies "Januarie 15" so die eiendom afhanklikheid is ingestel op "m".
  2. Deur kode agter, die waarde van die eiendom afhanklikheid is ingestel op "D", die comboboks is opgedateer om die vertoning "Donderdag, 15 Januarie, 1970" as die geselekteerde item.

Ek het probeer om met behulp van omsetters maar ConvertBack was onmoontlik, want ek kan nie onttrek 'n formaat string wat gebruik word om 'n sekere datum te skep.

Was dit nuttig?

Oplossing

Jy kan 'n klas DateFormatChoice dat 'n eiendom vir die formaat kode (bv "m" of "D") en 'n eiendom vir die huidige datum geformateerde op dié manier bevat skep.

public class DateFormatChoice {
    public string FormatCode { get; private set; }
    public string CurrentDateExample {
        get { return DateTime.Now.ToString( FormatCode ) }
    }

    public DateFormatChoice( string standardcode ) {
        FormatCode = standardcode;
    }
}

Jy bind jou ComboBox 'n versameling van hierdie gebruik van CurrentDateExample in óf jou DataTemplate of as DisplayMemberPath die ComboBox se. Jy kan óf direk gebruik hierdie voorwerpe met jou datum formaat plukker klas en die DatePicker bind aan die FormatCode eiendom van die gekose DateFormatChoice voorwerp, of jy kan die eiendom ValueMemberPath stel op die oorspronklike ComboBox die FormatCode eiendom en gebruik SelectedValue op die ComboBox vir die kry / opstel wat gekies word. Nie met behulp van ValueMember dalk 'n bietjie makliker wees.


Hier is 'n meer volledige voorbeeld. Dit maak gebruik van die klas DateFormatChoice hierbo.

In die eerste plek 'n versameling data.

public class DateFormatChoices : List<DateFormatChoice> {
    public DateFormatChoices() {
        this.Add( new DateFormatChoice( "m" ) );
        this.Add( new DateFormatChoice( "d" ) );
        this.Add( new DateFormatChoice( "D" ) );
    }
}

Toe het ek eenvoudig ViewModel vir die Venster:

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 ) );
    }
}

Ek het nie 'n datum plukker beheer wat die standaard string formaat kodes aanvaar, so ek het 'n baie dom UserControl (met baie hoeke te sny) gemaak net om die ontvangs van die formaat kode demonstreer. Ek het dit 'n afhanklikheid eiendom genoem DateFormatProperty van tipe string en gespesifiseerde n waarde verander terugbel in die UIPropertyMetadata.

<Grid>
    <TextBlock Name="datedisplayer" />
</Grid>

Die terugbel:

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 );
    }
}

En dit is hoe ek vasgebind dit alles saam in die venster.

<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>
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top