항목 소스가 바인드를 새로 고치게하는 방법은 무엇입니까?
문제
바인딩 된 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
컬렉션의 내용을 수정하면 자동으로 재 포장됩니다.