2

我在自定義UserControl中遇到了一些與我的DependencyProperty有關的問題。WinRT DependencyProperty從未設置

我需要以特定方式顯示有關人員的信息。爲了做到這一點,我有幾個UserControls,收到List<PeopleList>其中包含(顯然)一個或多個人。

讓我告訴你我的(簡化)代碼,然後我會向你解釋我的應用程序的實際行爲。

這裏是我的用戶:

public abstract class PeopleLine : UserControl 
{ 
    public static readonly DependencyProperty PeopleListProperty = 
     DependencyProperty.Register("PeopleList", typeof(List<PeopleModel>), typeof(PeopleLine), new PropertyMetadata(default(List<PeopleModel>))); 

    public List<PeopleModel> PeopleList 
    { 
     get { return (List<PeopleModel>)GetValue(PeopleListProperty); } 
     set { SetValue(PeopleListProperty, value); } 
    } 
} 

然後我的XAML:

<local:PeopleLine 
    x:Class="MyApp.Controls.EventSheet.OnePeople" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:MyApp.Controls.EventSheet" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 

    <Grid 
     Margin="0 5" 
     VerticalAlignment="Top" 
     Height="51"> 
     <TextBlock 
      Grid.Column="1" 
      HorizontalAlignment="Center" 
      Foreground="Red" 
      FontSize="25" 
      Text="{Binding PeopleList[0].Name}"/> 
    </Grid> 
</local:PeopleLine> 

而且我Page包含有正確ItemsSource(我已經選中它)和一個ItemsControl這一切開始ItemTemplateSelector(也完美工作)。下面是選擇使用的DataTemplate之一:

<DataTemplate x:Key="OnePeople"> 
    <peoplecontrols:OnePeople 
     PeopleList="{Binding LinePeopleList}"/> 
</DataTemplate> 

我使用的幾種模式,因爲我簡化了我的代碼,只有最重要的信息是不是真的很重要在這裏。

所以,回到我的問題。當用一個字符串替換選擇器的DataTemplate中的peoplecontrols:OnePeople並將LinePeopleList[0].Name作爲Text時,我顯示了正確的文本,證明我的數據在此時是正確的。 問題是,當放回我的peoplecontrols:OnePeople時,我的DependencyProperty從未設置。我在PeopleList的setter中放置了一個斷點,它從不觸發。

我嘗試了幾個修改(特別是那些在這個post中給出的,因此替換typeof(List<PeopleModel>)typeof(object)已經嘗試過),但沒有成功。此外,我試圖取代我DependencyPropertystring並直接在DataTemplate但二傳手仍不能稱爲發送名稱...

我沒有更多的想法,現在,不明白這有什麼錯我的代碼。任何幫助將不勝感激。 在此先感謝。

托馬斯

回答

1

嘗試增加在用戶控件的構造以下行,在InitializeComponent調用後:

(this.Content as FrameworkElement).DataContext = this; 

我創建了這方面一個示例應用程序。希望它正確地反映了自己的情況:

https://github.com/mikoskinen/uwpusercontrollistdp

如果克隆的應用程序並運行它,你會發現,綁定不起作用。但是,如果您從UserControl取消Datacontext =這一行的註釋,那麼一切都應該可以正常工作。這裏的工作代碼:

public PeopleLine() 
    { 
     this.InitializeComponent(); 

     (this.Content as FrameworkElement).DataContext = this; 
    } 
+0

人這個解決方案是非常優雅!我發現了另一個正在做同樣的事情,我命名我的UserControl(例如'x:Name =「Parent」''),然後在我的根視圖中設置DataContext,如下所示:'DataContext =「{綁定ElementName =父}「'。感謝您的回答,雖然:) –

相關問題