使用XAML绑定依赖项属性

时间:2013-12-20 11:14:47

标签: c# .net wpf

在我的用户控件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,它使用两个用户控件。 MainControlTreassureControl。 我想将ICarRepository类型的存储库发送到任何此控件,因此我在RepositoryICarRepository中创建了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); }
        }

标签内容未使用预期内容进行更新。

2 个答案:

答案 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());    
}