在我的用户控件MainControl中,我有一个名为Repository的依赖项属性。我想使用xaml
在MainWindow中绑定此存储库属性<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
,它使用两个用户控件。 MainControl
和TreassureControl
。
我想将ICarRepository
类型的存储库发送到任何此控件,因此我在Repository
和ICarRepository
中创建了MainControl
类型为TreassureControl
的DependencyProperty
我的目标是将存储库实例发送到MainControl
Repository
属性(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 :(得分: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 :(得分: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());
}