2010-01-03 5 views
1

질문 : ComboBox의 선택한 항목을 하나의 속성에 바인딩하고 항목 목록을 다른 속성으로 바인딩을 어떻게 설정합니까?콤보 상자의 선택한 항목 및 항목 목록을 wpf의 다른 속성에 바인딩


정보 :.

나는 그들이에서 와서이 있도록 내가 설정하는 일이 선적을받는 사람들 대부분이 목표로 내 회사에서 일하고 있어요 재고 프로그램이 화면의 한쪽에있는 발송물 목록. 이 중 하나를 선택하면 발송물의 모든 정보가 표시되므로 편집 할 수 있습니다. 한 비트의 정보는 선적을받은 사람입니다. 나는 그들이 선적물을 클릭했을 때 분명히 선적을받은 사용자가 콤보 상자에서 갑자기 나타나기를 원한다. 하지만 나는 다른 모든 사용자의 목록을 포함하는 콤보 상자를 원한다.

데이터베이스에서 사용자 목록을 가져 오지 않는다면 어렵지 않을 것입니다. 목록 상자에는 사용자 데이터 유형 목록에서 적절한 정보를 가져 오는 데 필요한 데이터 템플리트가 있습니다. 지금까지 시도한 것은 viewmodel에서 콤보 상자가 해당 목록에 바인드 된 다음, 발송물 데이터 유형과 함께 제공되는 단일 사용자 인스턴스 인 별도의 속성으로 바인딩되는 컬렉션보기를 갖는 것입니다.

M-V-VM 프로그래밍 모델에 따라 Visual Basic 및 XAML로 프로그래밍하고 있습니다.

답변

1

아무런 문제가 없습니다.

  • 출력에서 ​​보라 비어있는 콤보 상자의 측면에서

    public ObservableCollection<Shipment> AllShipments { get; private set; } 
    public Shipment SelectedShipment { get; set; } 
    
    // Constructor 
    public MyViewModel() 
    { 
        AllShipments = ReadFromDb(); 
    } 
    

    : 뷰 모델은 DB 선택한 항목에 바인딩 별도의 재산, 같은에서 유형의 컬렉션을 노출 할 수 있습니다 응용 프로그램을 시작할 때 VS 창에 - 바인딩 실패에 대한 불평 라인이 있습니까?

  • xaml에 대한 속성의 철자를 다시 확인하십시오. 바인딩
  • 보기가 바인딩을 인스턴스화 할 때 AllShipments 게터에 중단 점을 설정하여 null이 아닌지 확인하십시오. 위와 같이 VM의 생성자에서 db를 읽으면이 작업이 정상적으로 수행됩니다.

또한 - 콤보 박스 다음, 선적 개체에서 사용자를 표시 INotifyPropertyChanged를 구현하고 SelectedShipment 세터의하여 PropertyChanged 이벤트를 발생하여 VM (또는 기본)을 보장하기 위해 기억하고 싶은 경우 -이 것

희망이 도움이 :) ... 데이터 바인딩을 통해보기를 통해 변경 내용을 전파

+0

그것이 내가 내 LINQ 문 후 .ToList를 놓친했다 채우기되지 않은 이유를 밝혀졌습니다. 그래서 그것은 잘 작동하고 멋장이가되었습니다. 그러나 나는 아직도 나의 선적 사용자가 제대로 묶이는 것을 얻지 못하고있다. Inotify가 구현되었지만 여전히 작동하지 않습니다. 더 이상의 제안? – Narcolapser

+0

http://ianrandallonwpf.wordpress.com에서 * 간단한 간단한 * 마스터 디테일 컨트롤을 만드는 방법에 대한 간단한 블로그 시리즈를 작성했습니다. 그것은 ListBox를 사용하지만 ComboBox로 쉽게 교체 할 수 있습니다 ... HTH :) – kiwipom

+0

나는 이미 그렇게하고 있습니다. 내 코드는 화면의 왼쪽에 목록 상자가 있도록 설정됩니다. 발송물을 선택한 다음 오른쪽의 컨텐츠 발표자가 관련 데이터를 표시합니다. 그 내용 발표자 안에는 내 문제가있는 콤보 박스가있다. 이 문제는 주인이 아니라 세부 사항이라는 사실에있는 것처럼 보입니다. 콤보 상자는 내가 원하는 것처럼 사용자 목록에 바인딩되어 있지만 선택한 사용자가 db에서 프로그램을로드하는 사용자가되기를 원합니다. – Narcolapser

0

난 당신이 Linq에-에-SQL 사용하고있는 가정이 질문에 대답 할 것이다 :

이가 일반적인 PITA 문제, 여기서 User 개체의 Shipment 속성에 User 개체에 대한 참조가 포함되어 있는데이 개체는 동일한 레코드를 나타내지 만 이 채워진 쿼리의 User 개체와 다릅니다.

이 문제를 해결하려면 을 Shipments의 목록과 동일한 DataContext에서 검색 한 사용자 목록에 바인딩 할 수 있습니다.

예 :

class ViewModel 
{ 
    public List<User> Users { get; set; } 
    public List<Shipment> Shipments { get; set; } 
    public Shipment SelectedShipment { get; set; } 

    public void ReadShipments() 
    { 
     using (var dc = new MyDataContext()) 
     { 
      DataLoadOptions dlo = new DataLoadOptions(); 
      dlo.LoadWith<Shipment>(x => x.User); 
      dc.LoadOptions = dlo; 
      Shipments = dc.Shipments.ToList(); 
      Users = dc.Users.ToList(); 
     } 
    } 
} 
+0

글 상자가 보이지 않는 것은 id10t 오류입니다. 깜박입니다. LINQ 문의 끝에 ... \ n 어쨌든 목록 상자가 채워지지만 선택한 사용자를 선적 된 사용자로 설정할 수 없습니다. 당신이 내게 준 C#에서 코드 변환기를 사용해 보았는데 VB에서는 이해가되지 않았다. 클래스의 시작 부분에 데이터 컨텍스트가 흐리게 표시되어 있으므로 둘 다 동일한 컨텍스트가 사용됩니다. 그러나 그것이 정확히 차이가 나는지 나는 알지 못합니다. \ n LINQ를 사용하여 나에게 좋은 추측. – Narcolapser

+0

배송 물을 조회하는 것과 동일한 데이터 인터페이스로 콤보를 채우고 있습니까? –

+0

자세히 살펴보면, 아니오. shipmentVM 내부에서 사용자를로드하고 있습니다. 이것은 내가 선적물에 팔레트에 사용하는 방법입니다, 그것은 잘 작동, 그래서 나는 재활용했다. 사용자를로드하고 AllShipmentsVM에서 해당 사용자에 대한 참조를 전달해야합니까? – Narcolapser

관련 문제