2013-12-20 68 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());  
}