UWP의보기 업데이트와 관련된 비동기 대기 문제

라비 쿠마르

내 UWP 앱에서 API 호출에서 반환 된 데이터를 기반으로 UI를 업데이트하고 있습니다. MyPageAPI 호출에서 다시 조정 된 데이터를 표시하는 페이지입니다.

public sealed partial class MyPage : Page
{
    private MyViewModel _viewModel;
    private MyApiResponse _result;
    private string _documentId;

    public DocumentDetailsPage()
    {
        this.InitializeComponent();            
        _viewModel = new MyViewModel();            
    }

    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);    
        _documentId = (string)e.Parameter;
        await GetDocumentDetails();
    }

    private async Task GetDocumentDetails()
    {   
        //THIS WORKS, BUT USING await INSTESD OF .Result DOESN'T UPDATE THE VIEW
        _result =  new MyApiCall(_documentId).GetResponseAsync().Result;
        PrepareViewModel();        
    }

    private void PrepareViewModel()
    {       
        viewModel.Type = _result.response.type;
        viewModel.VolumeNumber = _result.response.volumeNumber;
    }
}

다음은 API에 Http-POST 요청을하는 클래스입니다.

public class MyApiCAll
    {
        ...
        ...

        public async Task<MyApiResponse> GetResponseAsync()
        {
            MyApiResponse responseObject;
            using(HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.TryAddWithoutValidation("ABC", ABC);
                var response =   await _client.PostAsync("someURL", null).ConfigureAwait(false);
                var responseJson =  await response.Content.ReadAsStringAsync();
                responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<MyApiResponse>(responseJson);        
            }
            return responseObject;  
        }
    }

그리고 여기에 내 견해가 있습니다.

<StackPanel Style="{StaticResource ContainerStackPanel}"
            Visibility="{x:Bind viewModel.Type, Converter={StaticResource ConverterNameHere}, Mode=OneWay}">
    <TextBlock Text="ABC"/>
    <TextBlock Text="{x:Bind viewModel.Type, Mode=OneWay}"/>
</StackPanel>

<StackPanel Style="{StaticResource ContainerStackPanel}"
            Visibility="{x:Bind viewModel.volumeNumber, Converter={StaticResource ConverterNameHere}, Mode=OneWay}">
    <TextBlock Text="ABC"/>
    <TextBlock Text="{x:Bind viewModel.volumeNumber, Mode=OneWay}"/>
</StackPanel>

이것은 UI를 차단한다는 점을 제외하고는 완벽하게 작동하므로 Result메서드 호출에서를 제거하고 다음과 같이 await를 추가 할 때 :

_result = await new DocumentDetailsApiCall(_documentId).GetResponseAsync();

그런 다음 내 UI에 바운드 값이 표시되지 않고 비어 있습니다. viewModel 속성이 업데이트되었는지 확인할 수 있습니다.

INotifyPropertyChanged내 ViewModel 속성을 구현하지 않습니다 (구현 을 시도했지만 변경하지 않았습니다)

업데이트 제안 된대로, INPC내 viewModel에 추가 했고 여기에 내 ViewModel 클래스를 추가했습니다.

class MyViewModel : INotifyPropertyChanged
{
    private string _type;
    public string Type
    {
        get { return _type; }
        set
        {
            _type = value;
            this.OnPropertyChanged();
        }
    }

    private string _volumeNumber;
    public string VolumeNumber
    {
        get { return _volumeNumber; }
        set
        {
            _volumeNumber = value;
            this.OnPropertyChanged();
        }
    }        

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    { 
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

문제가 남아 있습니다. await연산자를 사용할 수 없습니다. .Result여전히 작동합니다.

저스틴 XL

호출이 Bindings.Update()문제를 해결 했으므로 바인딩식이 정확해야하지만 속성 변경 알림이 실패합니다.

여기서 실제로 무엇이 잘못되었는지 추측하지 않고 언제를 사용해야 Bindings.Update()하고 언제 INPC+ OneWay바인딩을 사용해야하는지 설명합니다 .

Bindings.Update()만 사용할 수 있습니다 x:Bind귀하의 UI는 거의 새 데이터로 업데이트 할 필요가없는 경우 바인딩 전통, 당신은 구현할 필요가 없습니다 달리, INPC사실,이 일을 실제로 훨씬 저렴하고 더 성능이 좋은이다, 당신의 재산과 OneTime(전화와 바인딩을 Bindings.Update()구현하는 것보다) INPCOneWay바인딩.

따라서 다음은 x:Bind-

<TextBlock Text="{x:Bind MyText}" Style="{StaticResource SubheaderTextBlockStyle}" />

public string MyText { get; set; }

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyText = "new text!!";
    Bindings.Update();
}

버튼을 클릭하면 새 텍스트TextBlock 로 채워집니다 !! . 내가 기본 사용 여기에 참고 OneTime바인딩 (즉 {x:Bind MyText}) 및 MyText단지 AA 정상 CLR 속성입니다.

이것은 Bindings.Update()마지막에 호출했기 때문에 작동하며 OneTime바인딩이 다시 초기화됩니다.

그러나 앞서 말했듯이 UI 업데이트가 거의 필요 하지 않은 경우에만 위의 접근 방식을 사용하는 것이 좋습니다. 대부분의 경우 그렇지 않으므로 전혀 사용할 필요없이 바인딩을 구현 INPC하고 작성 합니다.OneWayBindings.Update()

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

텍스트 편집보기와 관련된 Android 문제

분류에서Dev

팬 제스처 깜박임보기와 관련된 문제

분류에서Dev

JS 배열 읽기와 관련된 보안 문제?

분류에서Dev

JS 배열 읽기와 관련된 보안 문제?

분류에서Dev

'경로 내보내기'와 관련된 pyenv 및 anaconda 문제

분류에서Dev

데이터베이스에서 데이터 읽기와 관련된 PHP 문제

분류에서Dev

Python의 다중 처리와 관련된 동기화 문제, 이중 for 루프

분류에서Dev

트리거 만들기와 관련된 JavaScript / jQuery 문제

분류에서Dev

문자열 길이와 관련하여 NSTextField의 크기 업데이트

분류에서Dev

js에서 이미지의 비동기 로딩과 관련된 가능한 문제

분류에서Dev

"기본"RLMObject와 관련된 RLMObject 삭제

분류에서Dev

파일에 대한 동시 읽기 및 쓰기와 관련된 문제는 무엇입니까?

분류에서Dev

목록보기에서 xml 채우기와 관련된 C # 문제

분류에서Dev

부모보기의 부모보기와 관련된 Swift3 설정 제약

분류에서Dev

Kafka-타임 스탬프 추출기와 관련된 문제

분류에서Dev

객체에서 키 찾기와 관련된 TypeScript 문제

분류에서Dev

C ++ 배열 초기화와 관련된 Doxygen 문제

분류에서Dev

ion-auth sql 파일 가져 오기와 관련된 문제

분류에서Dev

AngularJS와 관련된 jQuery 선택기 문제

분류에서Dev

행 ID 가져 오기와 관련된 SQLite3 문제

분류에서Dev

최대 날짜와 관련된 문자열 값 가져 오기

분류에서Dev

컨테이너보기 관련 문제

분류에서Dev

날짜를 날짜로 내보내기와 관련된 xlsxWriter 문제

분류에서Dev

기본 설정 활동과 관련된 Android 에뮬레이터 문제

분류에서Dev

2 개의 다른 python 폴더 유지와 관련된 가져 오기 문제

분류에서Dev

API에서 이미지 가져 오기와 관련된 반응 문제

분류에서Dev

녹아웃 및 선택기와 관련된 어레이 필터링 문제

분류에서Dev

녹아웃 및 선택기와 관련된 어레이 필터링 문제

분류에서Dev

왼쪽 들여 쓰기와 관련된 MigraDoc 테이블 테두리 문제

Related 관련 기사

  1. 1

    텍스트 편집보기와 관련된 Android 문제

  2. 2

    팬 제스처 깜박임보기와 관련된 문제

  3. 3

    JS 배열 읽기와 관련된 보안 문제?

  4. 4

    JS 배열 읽기와 관련된 보안 문제?

  5. 5

    '경로 내보내기'와 관련된 pyenv 및 anaconda 문제

  6. 6

    데이터베이스에서 데이터 읽기와 관련된 PHP 문제

  7. 7

    Python의 다중 처리와 관련된 동기화 문제, 이중 for 루프

  8. 8

    트리거 만들기와 관련된 JavaScript / jQuery 문제

  9. 9

    문자열 길이와 관련하여 NSTextField의 크기 업데이트

  10. 10

    js에서 이미지의 비동기 로딩과 관련된 가능한 문제

  11. 11

    "기본"RLMObject와 관련된 RLMObject 삭제

  12. 12

    파일에 대한 동시 읽기 및 쓰기와 관련된 문제는 무엇입니까?

  13. 13

    목록보기에서 xml 채우기와 관련된 C # 문제

  14. 14

    부모보기의 부모보기와 관련된 Swift3 설정 제약

  15. 15

    Kafka-타임 스탬프 추출기와 관련된 문제

  16. 16

    객체에서 키 찾기와 관련된 TypeScript 문제

  17. 17

    C ++ 배열 초기화와 관련된 Doxygen 문제

  18. 18

    ion-auth sql 파일 가져 오기와 관련된 문제

  19. 19

    AngularJS와 관련된 jQuery 선택기 문제

  20. 20

    행 ID 가져 오기와 관련된 SQLite3 문제

  21. 21

    최대 날짜와 관련된 문자열 값 가져 오기

  22. 22

    컨테이너보기 관련 문제

  23. 23

    날짜를 날짜로 내보내기와 관련된 xlsxWriter 문제

  24. 24

    기본 설정 활동과 관련된 Android 에뮬레이터 문제

  25. 25

    2 개의 다른 python 폴더 유지와 관련된 가져 오기 문제

  26. 26

    API에서 이미지 가져 오기와 관련된 반응 문제

  27. 27

    녹아웃 및 선택기와 관련된 어레이 필터링 문제

  28. 28

    녹아웃 및 선택기와 관련된 어레이 필터링 문제

  29. 29

    왼쪽 들여 쓰기와 관련된 MigraDoc 테이블 테두리 문제

뜨겁다태그

보관