1

拥有一个简单的 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";
}
4

2 回答 2

1

只需绑定ItemsSource.

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

然后对于用户控件:

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

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

绑定到资源的示例:

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


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

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

于 2012-09-07T13:36:20.723 回答
1

不要那样,你会搞乱所有外部绑定的DataContext。改用UserControl.NameElementName绑定(或RelativeSource)。

于 2012-09-07T13:39:05.427 回答