2013-03-09 79 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-properties上的其他綁定工作,所以我真的不知道。根據這個問題,上面應該工作:

WPF Pass current item from list to usercontrol

看到這裏會拋出數據綁定例外,因爲傳遞的對象是有約束力的,而不是數據對象的示例項目。 http://dl.dropbox.com/u/33603251/TestBindingApp.zip

回答

0

你需要把一個x:Name="MyControl"在你的控制,然後你的綁定看起來像Ship="{Binding ElementName=MyList, Path=CurrentItem}",而不是僅僅{Binding}(這並不意味着什麼據我所知)。您的控件需要公開CurrentItem屬性。

如果你不想明確地命名你的控制,你可以嘗試玩Relative Source,但我沒有嘗試自己,所以不能幫你在這一個。

+0

{結合}是我在其他一些網站閱讀,就像我引用鏈接:http://stackoverflow.com/questions/3106190/wpf-pass-current-item-from-list-to- usercontrol我會稍後再試一試,謝謝。 – Boland 2013-03-11 09:26:24

+0

請進一步解釋。我必須在代碼後面添加一個屬性,但是它應該返回什麼?我在ItemsControl的ItemTemplate中有數據項可用,所以我不明白爲什麼我必須添加代碼隱藏。我只想獲取當前的數據項。在ASP.Net中,這很容易,爲什麼WPF/SL中的這麼難...... – Boland 2013-03-11 20:43:59

0

您的依賴屬性格式嚴重不足,因此XAML解析器不會像這樣對待它。

您需要將實例屬性類型更改爲Ship,並將DependencyProperty所有者類型更改爲ShipControl。然後,綁定將起作用(假定您綁定到船舶列表)。

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

不起作用,在示例項目中嘗試過。我得到一個COM異常,因爲傳遞給Ship的對象不屬於Ship類型。如果我將其更改爲對象,則可以在Ship_set中看到「值」是Binding類型而不是類型Ship。 – Boland 2013-03-11 20:44:52

+0

聽起來像DP一樣工作,您的XAML綁定不正確。你可以發佈你綁定ItemsControl的ItemsSource的集合嗎? – 2013-03-12 07:16:45

+0

查看測試項目http://dl.dropbox.com/u/33603251/TestBindingApp.zip – Boland 2013-03-12 09:25:29

相關問題