2013-12-20 172 views
0

在我的用戶控件MainControl中我有名爲Repository的依賴項屬性。我想用XAML使用XAML綁定依賴項屬性

<my:MainControl x:Name="mainControl" Repository="{Binding }" Visibility="Visible" /> 

和內部MainWindow.xaml.cs在主窗口這個倉庫屬性綁定我有

public MainWindow() 
{ 
    InitializeComponent(); 
    _repository = new CarRepository(); 
    DataContext = _repository; 
} 

裏面MainControl構造我的想法來顯示使用

public MainControl() 
{ 
    InitializeComponent(); 
    lblCountCars.Content = string.Format("there is {0} cars.", Repository.CountAllCars()); 
} 
一些文本

我在這裏做錯了嗎Repository="{Binding }"?當我在後面的代碼中註冊用戶控件後,一切正常,但我想學習如何使用xaml來做到這一點。

更新 要說清楚。我有MainWindow它使用兩個用戶控件。 MainControlTreassureControl。 我想送倉庫是ICarRepository類型的任何這種控制的,所以我創建的DependencyProperty在MainControlTreassureControl命名ICarRepository兩型Repository

我的目標是庫實例發送到MainControlRepository屬性(DP),並在標籤內容屬性lblCountCars.Content = Repository.CountAllCars();

打印此外,我想在用戶控件這個庫實例進一步工作,不僅顯示簡單的文本。

所以我建議嘗試波紋管

MainWindow.xaml

<my:MainControl x:Name="mainControl" Repository="{Binding Repository}" /> 

MainWindow.xaml.cs

private ICarRepository _repository; 
public MainWindow() 
{ 
    InitializeComponent(); 
    _repository = new CarRepository(); 
    DataContext = _repository; 
} 

MainControl.xaml

<UserControl x:Name="mainControl"> 
<Label Name="lblCountBooks" Content="{Binding ElementName=mainControl, Path=Repository.CountAllBooks()}" 
<ItemsControl ItemsSource="{Binding ElementName=mainControl, Path=Repository}" /> 

MainControl.xaml。 cs

public static readonly DependencyProperty RepositoryProperty = DependencyProperty.Register(
      "Repository", 
      typeof(ICarRepository), 
      typeof(MainControl), 
      new PropertyMetadata(null)); 

     public ICarRepository Repository 
     { 
      get { return (ICarRepository)GetValue(RepositoryProperty); } 
      set { SetValue(RepositoryProperty, value); } 
     } 

標籤內容未更新爲預期內容。

+0

請發表您的相關XAML爲您MainControl,也許代碼爲您的DP太 – blindmeis

回答

2

使用usercontrols中的依賴項屬性時,我使用elementname綁定來綁定到DP。因此,我將移除

lblCountCars.Content =的String.Format( 「有{0}的汽車。」, Repository.CountAllCars());

,做這樣的事情:

<UserControl x:Name="uc"> 
    ...  
    <Label Content="{Binding ElementName=uc, Path=Repository.Count}"/><!-- you can use ContentStringFormat here to get you formattet string--> 
    <ItemsControl ItemsSource="{Binding ElementName=uc, Path=Reportsitory}"/> 

你在你的主窗口結合看起來正確。編輯: 你可以綁定到屬性。所以而不是Repository.CountAllBooks()你需要一個屬性。如果您沒有機會在ICarRepository上創建屬性,則可以使用轉換器和Repository屬性作爲convertparameter來獲取您的信息。

1

這可能是您的MainControls數據上下文沒有在構造函數中設置。您需要使用DataContextChanged事件(http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontextchanged(v=vs.110).aspx)。

例如:

public MainControl() 
{ 
    InitializeComponent(); 
    DataContextChanged += MainControl_DataContextChanged; 
} 

void MainControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    lblCountCars.Content = string.Format("there is {0} cars.", Repository.CountAllCars());  
}