WPF用户控件的datacontext到代码后面的属性

时间:2012-09-07 13:31:29

标签: wpf

有一个简单的XAML用户控件,我想将DataContext设置为后面的代码(xaml.cs)文件。

我想在XAML中设置DataContext和Itemssource,所以我可以使用属性ListOfCars填充组合框

XAML

<UserControl x:Class="Sample.Controls.MyControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="85" d:DesignWidth="200">
    <Grid Height="85" Width="200" Background="{StaticResource MainContentBackgroundBrush}">
        <StackPanel Orientation="Vertical">                
            <ComboBox Height="23.338" x:Name="CarList" />                
        </StackPanel>    
    </Grid>
</UserControl>

背后的代码

public List<Cars> ListOfCars
{
  get { return _store.ListCars(); }
}

换句话说,我不是在代码隐藏中这样做,而是如何在XAML中设置绑定

public MyControl()
{
  InitializeComponent();
  _store = new Store();
  CarList.ItemsSource = _store.ListCars();
  CarList.DisplayMemberPath = "Name";
}

2 个答案:

答案 0 :(得分:1)

只需绑定ItemsSource

<ComboBox ItemsSource="{Binding ListOfCars}"/>

然后是UserControl:

<MyControl DataContext="{Binding *viewModel*}"/>

您必须绑定使用UserControl的DataContext而不是定义,因为在定义中您不知道要绑定什么。 Combobox自动位于控件的上下文中,因此您只需绑定到DataContext,无需任何其他工作。

绑定到资源的示例:

<Application.Resources>
  ...
  <viewmodels:ViewModelLocator x:Key="ViewModelLocator"/>
  ...
</Application.Resources>


<MyControl DataContext="{Binding Source={StaticResource ViewModelLocator}}"/>

这将创建ViewModelLocator的一个实例,然后将控件的DataContext绑定到该资源。

答案 1 :(得分:1)

Do not do that,你将把所有外部绑定搞砸到DataContext。请改为使用UserControl.NameElementName绑定(或RelativeSource)。