문제

나는 당신이 곱슬 괄호 안에서 무엇이든 할 수있는 곳에서 Flex에서 왔습니다. 나는 얻으려고 노력하고있다 TextBlock C#로 코딩하지 않고 오늘의 날짜와 시간을 표시합니다. 나는 운이 없으면 다음의 여러 가지 변형을 시도했습니다.

TextBlock Text="{Source=Date, Path=Now, StringFormat='dd/MM/yyyy'}"

나는 아마도 내가 단지 재산을 설정할 수 있다는 것을 알고 있습니다 MyDate 그리고 그것에 결합하지만 왜 내가 DateTime.Now 재산?

도움이 되었습니까?

해결책

Silverlight의 바인딩에는 소스 개체 또는 종속성 객체가 필요합니다. 해당 소스 개체에서 속성 (정의상 인스턴스 멤버에 바인딩하는) 또는 종속성 속성에 바인딩 할 수 있습니다.

부터 DateTime.Now Silverlight에서 직접 묶을 수없는 정적 속성이므로 일부 코드가 필요합니다. 다음으로 가장 좋은 점은 코드를 사용하는 것입니다.

  • XAML로 필요한 많은 것을 표현할 수 있습니다.
  • 가능한 한 결합 된 방식으로 그렇게합니다.

따라서 두 가지가 필요하다는 것을 분석 할 수 있습니다.

  1. DateTime의 정적 멤버를 일부 객체의 인스턴스 속성으로 노출시킵니다.
  2. 데이터 타임을 바람직한 출력으로 포맷 할 수있는 방법이 있습니다.

첫 번째 항목을 처리하기 위해 a StaticSurrogate 클래스, 여기서 액세스 할 수있는 정적 속성에 대한 인스턴스 속성을 생성합니다.

public class StaticSurrogate
{
    public DateTime Today { get { return DateTime.Today; } }
    public DateTime Now { get { return DateTime.Now; } }
}

이제 날짜 시간을 포맷하는 방법이 필요합니다. 값 변환기는이 작업에 적합한 도구이며, 이로부터 크게 빌려줍니다. Tim Heuer 블로그 :-

public class FormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter != null)
        {
            string formatterString = parameter.ToString();

            if (!String.IsNullOrEmpty(formatterString))
            {
                return String.Format(culture, String.Format("{{0:{0}}}", formatterString), value);
            }
        }

        return (value ?? "").ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

이 두 수업을 마련하면 이제 XAML에서 나머지를 수행 할 수 있습니다. 먼저 우리는 자원에 이러한 클래스의 사례가 필요합니다.

<UserControl.Resources>
    <local:StaticSurrogate x:Key="Static" />
    <local:FormatConverter x:Key="Formatter" />     
</UserControl.Resources>

이제 우리는 다음을 연결할 수 있습니다 TextBlock :-

<TextBlock Text="{Binding Today, Source={StaticResource Static},
    Converter={StaticResource Formatter}, ConverterParameter='dd MMM yyy'}" />

이 접근법에는 다음과 같은 장점이 있습니다.

  • 우리는 텍스트 블록이 배치 된 USERCONTROL에 코드를 추가 할 필요가 없으며 데이터 컨텍스트와 함께 바이올린을 바르지 않아도됩니다.
  • 정적 리소스는 app.Resources에 배치 될 수 있으며, 이는 텍스트 블록의 생성을 USERCONTROL에 다른 것을 추가 해야하는 것과 완전히 독립적으로 만들 수 있습니다.
  • 날짜를 표시하는 데 사용되는 서식을 독립적으로 수정할 수 있습니다.
  • 추가 정적 특성에 대한 액세스는 StaticSurrogate 수업.

다른 팁

Silverlight의 XAML에서 DATETIME.NOW를 선언 할 수 있더라도 (WPF에서 할 수 있기 때문입니다. http://soumya.wordpress.com/2010/02/12/wpf-simplified-part-11-xaml-tricks/), 시간이 업데이트되지 않는 문제가 있습니다. 두 번째에 업데이트되는 로컬 타이머를 사용하는 경우 시간이 업데이트 될 수 있습니다.

public class LocalTimer : INotifyPropertyChanged
{
    private DispatcherTimer timer;

    public LocalTimer()
    {
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1.0);
        timer.Tick += new EventHandler(TimerCallback);
        this.TimeFormat = "hh:mm:ss";
        this.DateFormat = "dddd, MMMM dd";
    }

    private void TimerCallback(object sender, EventArgs e)
    {
        PropertyChanged(this, new PropertyChangedEventArgs("FormattedDate"));
        PropertyChanged(this, new PropertyChangedEventArgs("FormattedTime"));
    }

    public bool Enabled
    {
        get { return this.timer.IsEnabled; }
        set { if (value) this.timer.Start(); else this.timer.Stop(); }
    }

    public string FormattedDate { get { return DateTime.Now.ToString(this.DateFormat); } set {} }
    public string FormattedTime { get { return DateTime.Now.ToString(this.TimeFormat); } set{} }

    public string TimeFormat { get; set; }
    public string DateFormat { get; set; }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

xaml ala에서 이것의 인스턴스를 선언하십시오.

<local:LocalTimer x:Key="theTime" Enabled="True" />

그리고 바인딩을 사용하여 시간이 항상 반영되도록하십시오.

<TextBlock Text="{Binding Source={StaticResource theTime}, Path=FormattedDate, Mode=OneWay}" x:Name="TodaysDate" />
<TextBlock Text="{Binding Source={StaticResource theTime}, Path=FormattedTime, Mode=OneWay}" x:Name="CurrentTime" />
xmlns:sys="clr-namespace:System;assembly=mscorlib"

Text="{Binding Source={x:Static sys:DateTime.Today}, StringFormat='Today is {0:dddd, MMMM dd}'}"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top