2010-05-31 17 views
2

我想將用戶控件(View)綁定到ListBoxItem。 ListBox綁定到ViewModel的集合。我已經設置了列表框的ItemTemplate像這樣:如何將用戶控件作爲ListBoxItem使用

但我得到的是空白ListBoxItems。我可以點擊它們,但沒有任何視覺效果。我的ContactView代碼很簡單:

<Border> 
    <DockPanel> 
     <StackPanel DockPanel.Dock="Right" Orientation="Vertical"> 
      <TextBlock Text="{Binding Path=ContactFirstName, FallbackValue=FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock> 
      <TextBlock Text="{Binding Path=ContactLastName, FallbackValue=LastName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock> 
      <TextBlock Text="{Binding Path=ContactNumber, FallbackValue=Number}" Margin="5, 0, 5, 0"></TextBlock> 
     </StackPanel> 
    </DockPanel> 
</Border> 

這有什麼問題?謝謝。

回答

0

似乎工作細跟我的樣本項目:

窗口1 XAML:

<Window x:Class="WpfApplication7.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WpfApplication7="clr-namespace:WpfApplication7" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <ListBox x:Name="myListbox"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <WpfApplication7:ContactView/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Window> 

ContactView XAML(沒有後面的代碼需要;)):後面

<UserControl x:Class="WpfApplication7.ContactView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Border> 
     <DockPanel> 
      <StackPanel DockPanel.Dock="Right" Orientation="Vertical"> 
       <TextBlock Text="{Binding Path=ContactFirstName, FallbackValue=FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock> 
       <TextBlock Text="{Binding Path=ContactLastName, FallbackValue=LastName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock> 
       <TextBlock Text="{Binding Path=ContactNumber, FallbackValue=Number}" Margin="5, 0, 5, 0"></TextBlock> 
      </StackPanel> 
     </DockPanel> 
    </Border> 

</UserControl> 

代碼窗口1:

public partial class Window1 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     myListbox.ItemsSource = new[] 
            { 
             new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 1 }, 
             new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 2 }, 
             new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 3 }, 
            }; 
    } 
} 

public class Contact 
{ 
    public string ContactFirstName { get; set; } 
    public string ContactLastName { get; set; } 
    public int ContactNumber { get; set; } 
} 

我認爲你的問題在於ItemsSource中的項目。確保你綁定到正確的屬性。我的聯繫人對象具有正確的屬性。也許你的ItemsSource中的對象有不同的屬性名稱?或者,這些對象是否有聯繫人的屬性,以保存您想要的屬性?

如果你在你的ItemsSource對象聯繫人屬性,你可以使用綁定在TextBlock中,如下所示(注意點):

<TextBlock Text="{Binding Path=Contact.FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock> 

希望這有助於有點針指向您的問題所在!

+0

我看不出我在做什麼以及在那裏做了什麼。綁定連線的位置沒有錯誤。如果我沒有綁定到正確的位置,我會在輸出窗口中看到一個錯誤,所以我知道我確實是。我已經調試了ViewModel,並且屬性肯定顯示了正確的值。我在set上調用OnPropertyChanged,所以綁定會更新。我只看到沒有錯...... – Harry 2010-06-01 11:53:37

+0

屬性是否也檢索?嘗試在get上放置一個斷點,看看它們是否真的被檢索到.. – Arcturus 2010-06-01 12:26:24

+0

這很奇怪...它設置它們,因爲它應該,但是當它去檢索它們的值爲零... – Harry 2010-06-01 12:45:29

1

您的ContactView不是「繼承」ItemTemplate的數據上下文。或者,相反,它本身就是,但「內在」控制是分開的。嘗試:

<View:ContactView DataContext="{Binding Path=.}" /> 

Path=.是一種特殊的結構表示 「當前的元素。」你甚至可以把它縮短到我想的{Binding}

如果您檢查輸出窗口,您應該有一堆錯誤說明如何爲這些TextBlock綁定提供對象。

+0

沒有區別。我確實已經在主ContactView文件中設置了ContactView的DataContext - 肯定會做同樣的事情? 而且在輸出窗口中完全沒有錯誤,我在那裏檢查過。 – Harry 2010-05-31 23:11:12

+0

奇怪。如果您遵循http://beacosta.com/blog/?p=52上的某些方法,是否會收到任何錯誤?是的,這會做同樣的事情 - 它只是沒有在您的文章中指定。 – JustABill 2010-06-01 00:02:05

+0

好的,我首先運行了轉換器,它返回的結果爲空。我也做了跟蹤輸出,它似乎將DataContext設置爲null ...跟蹤輸出表明它在ContactViewModel類中找到字符串屬性的訪問器。然後,它輸出「傳送值 - 獲得原始值」。我猜這不是一件好事。 – Harry 2010-06-01 00:44:47

1

您是否設置了ItemSource屬性?

ItemsSource="{Binding}" 
+0

是的,ItemsSource已被正確設置。 – Harry 2010-06-01 07:58:44

0

使用結合樣

<View:NameofControl DataContext="{Binding }" /> 
+0

看到你上面的帖子二... – Harry 2010-06-01 07:54:32

0

什麼時候你的ViewModels設置其屬性?它可能是因爲Binding將所有值讀取爲空(在設置數據之前) - 然後在實際設置數據時未收到通知。

+0

在構造函數中設置。所有屬性都使用調用的OnPropertyChanged()方法進行設置。我正在使用ObservableCollection,因此添加到集合中的任何項目都將(應該)出現。 – Harry 2010-06-01 11:37:04

相關問題