2014-02-15 2 views
1

내가 잘못 했나요? 사람이 재산의 msdnWindows 전화 8에서 xaml 바인딩의 속성 인덱서가 작동 할 수 있습니까?

인덱서는 인덱서가 적용된 속성 이름 다음에 괄호 안에 지정 될 수에 따라 몇 가지 제안

을 제공합니다. 예를 들어 Path = ShoppingCart [0] 절은 속성의 내부 인덱싱이 리터럴 문자열 "0"을 처리하는 방법에 해당하는 인덱스에 바인딩을 설정합니다. 여러 인덱서도 지원됩니다.

은 내가 ListImagePathList 데이터를 확신하기 때문에 내가 뷰 모델 코드를 제공하지 않는 내 XAML

<Image Source="{Binding ImagePathList[0]}" Height="50" Width="50" Grid.Row="0" Grid.Column="0" VerticalAlignment="Top" Margin="0,7,7,0" Grid.RowSpan="2"> 

에 속성의 인덱서를 넣어.

EDIT * 보다 상세 : ImagePathList [0] 웹 이미지 URL을 브랜든

모델

EDIT이다 ArticleViewModel 아래에 기술

public class Article : INotifyPropertyChanged 
    { 
     private long _Id; 
     public long ID 
     { 
      get { return _Id; } 
      set 
      { 
       if (_Id != value) 
       { 
        _Id = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 


     private string _subject; 
     public string Subject 
     { 
      get 
      { 
       return _subject; 
      } 
      set 
      { 
       if (_subject != value) 
       { 
        _subject = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     private string _words; 
     public string Words 
     { 
      get 
      { 
       return _words; 
      } 
      set 
      { 
       if (_words != value) 
       { 
        _words = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     private DateTime _publishDate; 
     public DateTime PublishDate 
     { 
      get 
      { return _publishDate; } 
      set 
      { 
       if (_publishDate != value) 
       { 
        _publishDate = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     public List<string> ImagePathList = new List<string>(); 

     private string _firstImage; 
     public string FirstImage 
     { 
      get 
      { 
       return _firstImage; 
      } 
      set 
      { 
       if (_firstImage != value) 
       { 
        _firstImage = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (null != handler) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

인 ; 네트워크에서 반환 된 모든 데이터가 정확합니다!

public class ArticleListViewModel : INotifyPropertyChanged 
    {  
     public ArticleListViewModel() 
     { 
      this.ArticleCollection = new ObservableCollection<Article>();     
     } 

     public ObservableCollection<Article> ArticleCollection 
     { 
      get; 
      private set; 
     } 

     public void LoadPage(int pageNumber) 
     { 
      if (pageNumber == 1) 
      { 
       this.ArticleCollection.Clear(); 
      } 

      IsLoading = true; 
      ReadArticleList(pageNumber); 

     } 

     private async void ReadArticleList(int pageNumber) 
     { 
      try 
      { 

       List<Article> articleList = new List<Article>(); 
       articleList = await CollectionHttpClient.GetArticlesByPageAsync(pageNumber); 

       this.ArticleCollection.Add(item); 

       } 

      } 
      catch(Exception ex) 
      { 
       if (ex.HResult == -2146233088 && ex.Message.Equals("Response status code does not indicate success: 404().")) 
       { 
        MessageBox.Show("The network is not set right. Internet cannot be accessed."); 
       } 
       else 
       { 
        MessageBox.Show("sorry, no data."); 
       } 

      } 

     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(String propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (null != handler) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

    } 
+0

이미지가 자원입니까, 아니면 해당 리소스가 IsolatedStorage로 다운로드 되었습니까? – Romasz

+0

@Romasz 다운로드, 질문에 편집 내 – max

+1

ImagePathList [0]에 의존하는 절대 Uri를 반환하는 getter로 속성에 바인딩하려고 했습니까? – Romasz

답변

1

표시되는 XAML 코드는 문제가 없습니다.

DataContext에 문제가있을 수 있습니다. 아마 DataContext 페이지가 설정되지 않았습니까? 또는 DataContext이 변경되었습니다. 내부 : ItemTemplate

기타이 문제는 아마도 바인딩 된 속성과 관련이 있습니다. 다음

private ObservableCollection<string> _imagePathList = new ObservableCollection<string>(); 
public ObservableCollection<string> ImagePathList { 
    get { return this._imagePathList; } 
    set { 
     if (this._imagePathList != value) 
     { 
      this._imagePathList = value; 
      // I'm going to assume you have the NotifyPropertyChanged 
      // method defined on the view-model 
      this.NotifyPropertyChanged(); 
     } 
    } 
} 

ObservableCollectionSystem.Collections.ObjectModel에 있으며 List 비슷하지만 요소가 추가 된 경우/다음 PropertyChanged 이벤트가 발생되어 제거하십시오. 또한 바운드 프로퍼티는 모두 작동하기 위해 연결된 get이 있어야합니다.

또 다른 가능성은 ImagePathList은 (는) 할당되지 않았거나 비어 있습니다. 어떤 경우에는 할당해야합니다. 경우

은 아직

public event PropertyChangedEventHandler PropertyChanged; 

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

당신은 또한 포함하는 클래스 예에 INotifyPropertyChanged 인터페이스를 추가해야합니다 ... 여기있다는 NotifyPropertyChanged 방법을 구현하지 않은

public class MyViewModelClass : INoftifyPropertyChanged 
{ 
    ... 
} 
+0

*** 브리 던을위한 *** 편집을 참조하십시오. – max

+1

두 가지 문제점이 있습니다. 먼저 바인딩 된 모든 속성에는'List '대신에 getter가 있어야합니다. ObservableCollection 을 사용해야합니다 '. 위에서 정의한 'ImagePathList'에 대한 정의를 바꾸면 작동 할 것입니다 ... – Brendan

0

나는이 문제가 당신의 이미지가 나오는 곳과 관련이 있다고 생각한다. 그것이라고 말한대로 MSDN :

당신은 소스를 설정할 수 있습니다.http://contoso.com/myPicture.jpg) 응용 프로그램의 XAP 파일에 상대적인 URL을 지정하십시오.

이 속성은 XAML에서 설정할 수 있지만이 경우 속성을 URI로 설정합니다. XAML 동작은 문자열을 URI로 처리하고 BitmapImage (Uri) 생성자를 호출하는 기본 형식 변환을 사용합니다. 차례로,이 URI로부터 스트림을 요구해, 이미지 소스 오브젝트를 돌려줍니다.

테스트 용 - 프로젝트에 일부 이미지를 놓은 다음 ImagePathList를 설정하십시오. 그게 효과가 있는지 봅니다. (생각했던대로해야합니다.) 또는 BitmapImage (ImagePathList)를 얻을 수 있는지 확인하십시오.

오류의 원인이 될 수있는 지금은 말하기가 어렵습니다 (ImagePathList가 어떻게 생겼는지 모르기 때문에). 하지만 내가 너라면 이걸 시험해 볼거야.


나는 속성을 사용하는 권합니다 (또는 당신이 그 일을 할도합니다 변환기를 사용할 수 있습니다) : 당신이 IsolatedStorage에 이미지를 다운로드하는 경우 다음해야합니다 반면에

// a property in your class 
public Uri FirstImage 
{ 
    get 
    { 
     return new Uri(ImagePathList.FirstOrDefault(), UriKind.Absolute); 
    } 
} 

을 IS로부터 BitmapImage를로드하는 다른 속성을 사용하는 것입니다 :

public BitmapImage FirstImage // getter - BitmapImage 
{ 
    get 
    { 
     if (String.IsNullOrEmpty(ImagePath[0])) return null; 
     BitmapImage temp = new BitmapImage(); 

     using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication()) 
     using (IsolatedStorageFileStream file = ISF.OpenFile(ImagePath[0], FileMode.Open, FileAccess.Read)) 
      temp.SetSource(file); 
     return temp; 
    } 
} 

희망이 있습니다.

+0

여기에 제 질문을 정리해 드리겠습니다. 나에게 도움이되는 또 다른 속성을 추가하십시오. 그리고 나는 그것이 작동 할 수 있다고 확신합니다. 내 코드가 지금은 다른 솔루션이 있기 때문에 잘 작동합니다. 하지만 나는 더 많이 파고 싶다. 내 질문은 여기에 MSDN은 "속성의 인덱서가 대괄호 안에 지정 될 수있다"고 말합니다. "왜 WP8에서. ImagePathList [0]을 사용했지만 작동하지 않습니다. – max

+0

@max 몇 가지 조사를 마친 후에 대답을 다시 작성했습니다. – Romasz

+0

당신의 대답에 대한 Thnx, Romasz, @ Brendan의 답변이 저에게 효과적입니다. 그것은 ImagePathList를위한 getter 메서드가 아닙니다. – max

관련 문제