TimeSpan
속성에 바인딩 된 텍스트 블록을 포맷하려고 합니다. 속성이 유형이면 작동 DateTime
하지만 TimeSpan
. 변환기를 사용하여 수행 할 수 있습니다. 그러나 나는 대안이 있는지 알아 보려고 노력하고 있습니다.
샘플 코드 :
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
텍스트 블록에 시간과 민트 만 표시 될 것으로 예상됩니다. 그러나 다음과 같이 표시됩니다.
19 : 10 : 46.8048860
답변
.NET 3.5에서는 대신 MultiBinding을 사용할 수 있습니다.
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}:{1}">
<Binding Path="MyTime.Hours"/>
<Binding Path="MyTime.Minutes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
업데이트
의견에 답변합니다.
시간 또는 분이 0-9 인 경우에도 2 자리 숫자를 출력하려면 {0} 대신 {0:00}을 사용할 수 있습니다. 이렇게하면 시간 12:01의 출력이 12 : 1이 아닌 12:01이됩니다.
01:01을 1:01로 출력하려면StringFormat="{}{0}:{1:00}"
그리고 조건부 서식 을 사용하여 몇 분 동안 음수 부호를 제거 할 수 있습니다. {1:00} 대신 {1 : 00; 00}을 사용할 수 있습니다.
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:00}:{1:00;00}">
<Binding Path="MyTime.Hours" />
<Binding Path="MyTime.Minutes" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
답변
형식 문자열은 작업 할 의도 DateTime
가 아닌를 TimeSpan
.
DateTime.Now
대신 사용할 코드를 변경할 수 있습니다 . 귀하의 xaml은 괜찮습니다.
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
최신 정보
그리고 다음과 같이 .Net 4 형식 a TimeSpan
에서 :
<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
답변
풀에 추가하기 위해이 바인딩을 성공적으로 사용하여 프로덕션 WPF 앱에 TimeSpan을 표시합니다.
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
백 슬래시를 올바르게 잡으려고 시도했습니다. 🙂
답변
StringFormat
형식 문자열 형식이어야합니다. 이 경우 다음과 같습니다.
<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
참고 : 총 시간 및 분 수를 표시하고 시간 범위가 24 시간을 초과하는 경우 접근 방식에 대한주의 사항이 있습니다 . 해결 방법은 다음과 같습니다 .
답변
다중 바인딩의 경우 .NET 4부터주의해야합니다.
아래의 간단한 개요는 .NET 4.6으로 테스트되었습니다.
일반 바인딩 :
<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />
다중 바인딩 :
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:hh':'mm':'ss} -> {1:hh':'mm':'ss}">
<Binding Path="Start" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="End" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</TextBlock.Text>
또는 다중 바인딩에서 ‘ 대신 “ 를 사용할 수 있습니다 .
<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>
참고 : 사용 =있는 StringFormat을 “{HH \ : \ mm \ 0 SS를} {} -> {1 : HH : \ mm \ SS}” 할 수 없습니다 MultiBinding에 작업이 빈 결과가 발생합니다.
답변
나는이 질문이 이제 오래되었다는 것을 알고 있지만 아무도 직접적으로 StringFormat
작동 할 간단한 제안을 제안하지 않았다는 것에 놀랐습니다 TimeSpan
.
<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
답변
.NET 4의 WPF에는 이제 문자열 http://msdn.microsoft.com/en-us/library/ee372286.aspx의 시간 범위가 있습니다 .
나는 다음을 사용하고있다 <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />