2013-03-09 4 views
0

Windows Phone 7.1 프로젝트 (WP 8.0 SDK)의 현재 항목에 바인딩, ItemTemplate의 현재 항목을 사용자 정의 컨트롤에 전달하고 싶습니다.ItemsControl (WP7.1/8.0/Silverlight)

XAML : ShipControl 뒤에

 <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <local:ShipControl Ship="{Binding}" x:Name="ShipControl"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 

코드 : 그러나

public object Ship 
    { 
     get 
     { 
      return GetValue(ShipProperty); 
     } 
     set 
     { 
      SetValue(ShipProperty, value); 
     } 
    } 

    //Used by xaml binding 
    public static readonly DependencyProperty ShipProperty = DependencyProperty.Register("Ship", typeof(Ship), typeof(Ship), new PropertyMetadata(null, new PropertyChangedCallback(OnShipChanged))); 

    private static void OnShipChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     //TODO: Set break point here 

     return; 
    } 

, 선박을 디버깅 할 때 값 데이터 바인딩의 객체가 값으로 전달되지 선박 (그러므로 대신의 객체 타입입니다 반환 배). 결국 SetValue 예외가 발생합니다. Ship 속성의 다른 바인딩이 작동하기 때문에 아무런 아이디어가 없습니다. 이 질문에 의하면, 위의 작동합니다 :

WPF Pass current item from list to usercontrol

이 객체로 건네받는 대신 데이터 객체의 바인딩되어 있기 때문에, 데이터 바인딩에 예외를 발생시킵니다 샘플 프로젝트 여기를 참조하십시오. http://dl.dropbox.com/u/33603251/TestBindingApp.zip

답변

0

당신은 당신의 통제에 x:Name="MyControl"을 넣어해야하고, 다음은 (많은 AFAIK를 의미하지 않는) 대신 {Binding}Ship="{Binding ElementName=MyList, Path=CurrentItem}" 모양을 결합. 컨트롤이 CurrentItem 속성을 노출해야합니다.

컨트롤 이름을 명확하게 지정하지 않으려면 Relative Source으로 게임을 시도해 볼 수는 있지만 나 자신을 시도하지 않았으므로이 게임에서 도움을받을 수 없습니다.

+0

나는, 다른 사이트에서 읽은 것을 한 {바인딩} 내가 인용 링크와 같은 : http://stackoverflow.com/questions/3106190/wpf-pass-current-item-from-list-to- usercontrol 나중에 시도해 볼께 고마워. – Boland

+0

더 자세히 설명해주세요. 코드에서 속성을 추가해야하지만 반환해야하는 항목은 무엇입니까 ?? 데이터 아이템을 사용할 수있는 ItemsControl의 ItemTemplate에 있는데 왜 코드 숨김을 추가해야하는지 이해할 수 없습니다. 난 그냥 현재 데이터 항목을 얻고 싶습니다. ASP.Net에서 이것은 쉬울 것입니다, 왜 이렇게 WPF/SL에서 열심히 ... – Boland

0

종속성 속성이 잘못 만들어서 XAML 파서가 이와 같이 처리하지 않습니다.

Ship으로 인스턴스 속성 유형을 변경하고 ShipControl에 DependencyProperty 소유자 유형을 변경해야합니다. 그런 다음 바인딩이 작동합니다 (귀하가 선박 목록에 바인딩되어 있다고 가정).

public Ship Ship 
{ 
    get { return (Ship)GetValue(ShipProperty); } 
    set { SetValue(ShipProperty, value); } 
} 

public static readonly DependencyProperty ShipProperty = 
    DependencyProperty.Register("Ship", typeof(Ship), typeof(ShipControl), new PropertyMetadata(null, new PropertyChangedCallback(OnShipChanged))); 

private static void OnShipChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    //TODO: Set break point here 

    return; 
} 
+0

샘플 프로젝트에서 작동하지 않습니다. 전달 된 객체가 Ship 유형이 아니기 때문에 COM 예외가 발생합니다. 객체로 변경하면 Ship_set의 "value"가 Ship 유형 대신 Binding 유형임을 알 수 있습니다. – Boland

+0

DP와 같은 소리가 나고 XAML 바인딩이 잘못되었습니다. ItemsControl의 ItemsSource를 바인딩 할 컬렉션을 게시 할 수 있습니까? –

+0

테스트 프로젝트 참조 http://dl.dropbox.com/u/33603251/TestBindingApp.zip – Boland