2017-10-15 5 views
1

중복 질문을하기 전에 문제에 대한 해결책을 찾을 수 없다고 말하고 싶습니다. 내가하고 싶은 것은 배열의 원소를 속성에 묶는 것이고 나의 경험이 부족하기 때문에 어떻게 알아낼 수없는 것입니다. 여기Array 요소를 xaml 속성에 바인딩

내 C# 코드는 모습입니다 :

public class MainPageImplement : INotifyPropertyChanged 
{ 
    BitmapImage[] weatherIconSource = new BitmapImage[7]; 
    public BitmapImage[] WeatherIconSource 
    { 
     get { return weatherIconSource; } 
     set 
     { 
      weatherIconSource = value; 
      NotifyPropertyChanged("WeatherIconSource"); 
     } 
    } 
    private void NotifyPropertyChanged(string propName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
여기

내 XAML 속성을 보이는 방법 :

내 코드 갈 오류없이 실행
 <Image Grid.Column="1" Name="WeatherIconZero" Source="{x:Bind PropertyName.WeatherIconSource[0], Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 

떨어져 있지만 실제로 아무것도 바인딩하지 않습니다. 그러나 배열의 요소가 아니라 BitmapImage 변수를 사용하면 올바르게 작동합니다.

+0

'WeatherIconSource' 속성? 각 색인을 개별적으로 수정하면 (예 :'WeatherIconSource [0] = myBitmap;'), UI의 속성 변경을 알리지 않기 때문입니다. 'ObservableCollection '을 사용하면 많은 고통을 덜 수 있습니다. 배열은 UI에 변경 사항을 전달하지 않습니다. – Laith

+0

올바른 속성을 얻을 수있는 일련의 메서드가 있다고 말할 수 있습니까? 이러한 메소드 중 일부는 다른 속성에서도 공유됩니다. UI를 업데이트하기 위해 이러한 배열을 업데이트하는 메서드를 호출하는 타이머를 설정했습니다. 배열을 업데이트 할 때마다 PropertyChanged를 호출하여 UI를 업데이트하는 'set'이 있습니다. 이것은 배열을 사용하지 않고 각 속성에 고유 한 경로를 부여 할 때 완벽하게 작동합니다. 그러나 배열을 사용하면 코드가 더 멋지게 보이고 수백 줄의 코드가 저장됩니다. 편집 : 다른 스레드에서 실행되는 특정 시간에 UI 업데이트 오전 추가해야합니다. – Oybek

+0

좋아, 내 대답은 아래 :) – Laith

답변

1

배열은 적어도 인덱스별로 상기 UI에 바인딩되지 않는다. 당신은 사용할 필요가 ObservableCollection<T> :

public ObservableCollection<BitmapImage> WeatherIconSource { get; } = new ObservableCollection<BitmapImage>(); 

배열을 사용하여 귀찮게하지 마십시오 당신이 배열 붙어있는 경우 단일 인덱스 속성 변경

NotifyPropertyChanged("WeatherIconSource[5]"); // Doesn't work. 

를 통지 할 수없는, 당신은 속성이 단일 인덱스를 업데이트 할 때마다 전체 컬렉션에 변경 통지해야한다 :

WeatherIconSource[5] = myNewBitmap; 
NotifyPropertyChange("WeathIconSource"); // Updates all [0] [1] ... [n] 

을하지만, 이렇게하면 모든 인덱스에서 강제로 새로 고칩니다. 모든 이미지가 다시 그려집니다. 작은 이미지가있는 앱이 단순하다면이 문제를 해결할 수 있습니다. 그렇지 않으면 ObservableCollection<T>으로 변경하십시오. 이 같은 정확한 인덱스와 바인딩을 하드 코딩 한 경우

:

Source="{x:Bind PropertyName.WeatherIconSource[0], Mode=OneWay}" 
Source="{x:Bind PropertyName.WeatherIconSource[2], Mode=OneWay}" 
Source="{x:Bind PropertyName.WeatherIconSource[5], Mode=OneWay}" 

다음과 같은 컬렉션을 인스턴스화 그래서 당신은하지 않습니다 IndexOutOfRangeException : 어떻게 설정하는

public ObservableCollection<BitmapImage> WeatherIconSource { get; } = new ObservableCollection<BitmapImage> 
{ 
    null, // [0] 
    null, // [1] 
    null, 
    null, 
    null, 
    null, 
    null // [6] 
}; 
+0

이것은 정말 아름다운 해결책입니다. 그것은 완벽하게 작동합니다.고마워요! – Oybek

0

그것은 있어야

`<Image Grid.Column="1" Name="WeatherIconZero" Source="{Binding weatherIconSource[0]}" HorizontalAlignment="Center" VerticalAlignment="Center" /`> 
+0

나는 그걸 시도했지만 동일한 결과를 추가해야합니다. – Oybek

+0

위 내 솔루션에서 잘 작동 – Sajeetharan

+0

난 그냥 다시 시도하고 나는 정정. NotifyPropertyChanged 메소드에 문제가 있습니까? – Oybek