항목 소스가 바인드를 새로 고치게하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/806714

  •  03-07-2019
  •  | 
  •  

문제

바인딩 된 Listbox를 보여주는보기가 있습니다. 모든 것을 가져라():

<DockPanel>
    <ListBox ItemsSource="{Binding GetAll}"
             ItemTemplate="{StaticResource allCustomersDataTemplate}"
             Style="{StaticResource allCustomersListBox}">
    </ListBox>
</DockPanel>

getAll ()은 관찰 된 수집 속성입니다 내 뷰 모델에서 :

public ObservableCollection<Customer> GetAll
{
    get
    {
        return Customer.GetAll();
    }
}

차례로 getall () 모델 메소드를 호출합니다 관측형 회합 수집을 채우기 위해 XML 파일을 읽습니다. :

public static ObservableCollection<Customer> GetAll()
{
    ObservableCollection<Customer> customers = new ObservableCollection<Customer>();

    XDocument xmlDoc = XDocument.Load(Customer.GetXmlFilePathAndFileName());
    var customerObjects = from customer in xmlDoc.Descendants("customer")
                          select new Customer
                          {
                              Id = (int)customer.Element("id"),
                              FirstName = customer.Element("firstName").Value,
                              LastName = customer.Element("lastName").Value,
                              Age = (int)customer.Element("age")
                          };
    foreach (var customerObject in customerObjects)
    {
        Customer customer = new Customer();

        customer.Id = customerObject.Id;
        customer.FirstName = customerObject.FirstName;
        customer.LastName = customerObject.LastName;
        customer.Age = customerObject.Age;

        customers.Add(customer);
    }

    return customers;
}

사용자가 다른 견해로 갈 때를 제외하고는 모두 잘 작동합니다. XML 파일을 편집합니다 그리고이 견해로 돌아옵니다 이전 데이터가 여전히 표시되고 있습니다.

실제 데이터를 표시하도록 "바인딩을 새로 고치는"이 견해를 어떻게 알 수 있습니까?

HTML/HTTP 은유가 너무 많아서 WPF에 대한 것 같은 느낌이 든다. 나는 관찰 된 수집을 스스로 업데이트 할 수있는 더 자연스러운 방법이 있다는 것을 느낀다. 그러나 이것이 내가 사용자가 할 수있는 유일한 방법이다. 현재 WPF 응용 프로그램에서 데이터를 편집 할 수 있습니다. 따라서 모든 수준에서의 도움은 여기에서 감사합니다.

도움이 되었습니까?

해결책

an ItemsControl 바인딩을 한 번 요청하고 그 후 참조를 캐시합니다.

수집 객체의 내용이 수정 된 경우 INotifyCollectionChanged (처럼 ObservableCollection 그렇습니다), 추가 또는 제거 된 객체를 선택합니다.

이제 바인딩이 새로운 컬렉션 객체를 ListBox, 뷰 모델을 구현할 수 있습니다 INotifyPropertyChanged 그리고 올라갑니다 PropertyChanged, 통과 GetAll 속성 이름으로. 이것은 속성 값이 변경되었다는 바인딩을 경고하는 효과가 있습니다 (새로운 ObservableCollection 픽업 준비) ListBox,이 항목을 재생합니다.

앱에서 변화에 영향을 미치는 한 ObservableCollection 반환 GetAll, 당신은 추가하고 제거 할 수 있으며 목록은 동기화됩니다. 외부 수정을 받으려면 (어딘가에 새로 고침 버튼이 있거나 전체 파일을 다시로드하는 것이 적합한 자연 지점이있을 수 있음) 뷰 모델을 올릴 수 있습니다. PropertyChanged 자동으로 속성 Getter를 호출하는 이벤트는 정적 메소드를 호출하여 새로운 컬렉션을 반환합니다.

nitpicker 참고 : 왜 방법 이름을 속성에 주는가?

다른 팁

아래 줄은 컬렉션에 객체를 추가하기 위해 제거 할 때와 동일하게 작동합니다.

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh();

당신에 대한 참조를 유지하십시오 ObservableCollection XML 파일의 최종 수정 시간을로드했을 때까지입니다. 창이 초점을 맞출 때마다 디스크 파일의 타임 스탬프를 확인하십시오. 그것이 바뀌면, 명확하고 다시 집중하십시오 ObservableCollection. GUI는 자동으로 변경 이벤트를 듣고 있습니다. ObservableCollection 컬렉션의 내용을 수정하면 자동으로 재 포장됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top