:
사용 IsAsync 속성을 당신의 바인딩 소스의 get 접근이 속성이 오래 걸릴 수 있습니다 때 시각. 한 예로 웹에서 다운로드하는 접근자인 의 이미지 속성이 있습니다. IsAsync를 true로 설정하면 다운로드하는 동안 UI가 차단되지 않습니다.
예를
<Image Source="{Binding MyImage,IsAsync=True, Converter={StaticResource MyConverter}}" />
더 Binding.IsAsync
비동기 변환기
에 나는 비동기 변환기를 만들 수 관리
namespace CSharpWPF
{
class AsyncConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return new AsyncTask(() =>
{
Thread.Sleep(4000); //long running job eg. download image.
return "success";
});
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
public class AsyncTask : INotifyPropertyChanged
{
public AsyncTask(Func<object> valueFunc)
{
AsyncValue = "loading async value"; //temp value for demo
LoadValue(valueFunc);
}
private async Task LoadValue(Func<object> valueFunc)
{
AsyncValue = await Task<object>.Run(()=>
{
return valueFunc();
});
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("AsyncValue"));
}
public event PropertyChangedEventHandler PropertyChanged;
public object AsyncValue { get; set; }
}
}
}
이 변환기는 비동기 적으로 작업을 실행합니다
클래스 AsyncTask
내에서 장기 실행 작업을 캡슐화하고 그것은 또한 따라서를 업데이트 알림을 사용 INotifyPropertyChanged
를 구현으로 AsyncValue
에 결과를 설정합니다 AsyncTask
의 인스턴스를 반환합니다 UI
사용
<Grid xmlns:l="clr-namespace:CSharpWPF">
<Grid.Resources>
<l:AsyncConverter x:Key="AsyncConverter" />
</Grid.Resources>
<TextBlock DataContext="{Binding MyProperty,Converter={StaticResource AsyncConverter}}"
Text="{Binding AsyncValue}" />
</Grid>
아이디어는 변환기와 t로 소자의 DataContext
결합하는 그 예를 상기
가
exmaple 너무 IMultiValueConverter
사용될 수있는 IValueConverter
동일한 접근되어 쉽게 데모 텍스트 블록의 텍스트 속성을 사용하는 새로운 데이터 콘텍스트의 AsyncValue에 속성을 요구.
여기에 코드의 관련 부분을 게시해야합니다. – Clemens