C# 如何将datacontext设置为UserControl的属性?

C# 如何将datacontext设置为UserControl的属性?,c#,wpf,combobox,binding,C#,Wpf,Combobox,Binding,具有此结构和组合框: public abstract class A: UserControl { public string MachineName { get; protected set; } ... } public partial class MainWindow : Window { private List<A> m_listA = new List<A>(); public MainPanel() {

具有此结构和组合框:

public abstract class A: UserControl
{
     public string MachineName { get; protected set; }
     ...
}

public partial class MainWindow : Window
{
     private List<A> m_listA = new List<A>();

     public MainPanel()
     {
        InitializeComponent();
        DataContext = this;
     
        cbMachines.ItemsSource = m_listA;
        cbMachines.SelectedIndex = 0;
        cbMachines.DisplayMemberPath = "MachineName";
     }
}
看起来,它将“A”主控件的网格作为datacontext 看起来,它将主控件作为数据上下文,但我需要usercontrol作为数据上下文


如何执行此操作?

默认组合框模板中的相应区域如下:

<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
获取默认的组合框模板

或者,您可以在代码隐藏中执行此操作:

cbMachines.ApplyTemplate();
var contentPresenter = cbMachines.Template.FindName("contentPresenter", cbMachines) as ContentPresenter;
System.Windows.Data.BindingOperations.SetBinding(contentPresenter, ContentPresenter.ContentProperty, new Binding("SelectedItem.MachineName") { Source = cbMachines });
contentPresenter.ContentTemplateSelector = null;

恐怕没有更简单的方法。

错误消息与此处显示的代码无关。除此之外,将UserControl作为数据项看起来很奇怪。类A不应派生自UserControl。错误由combobox引发,并将网格作为datacontext,datacontext是UserControl类herited的第一个控件。这是从Usercontrol和自定义类继承的唯一方法。因为,基本FrameworkElement上存在Name属性。第二组cbMachines.IsEditable=true;有了这些,我在显示所选项目时没有任何问题。而且我忘了说您应该异步设置SelectedIndex,比如:cbMachines.Dispatcher.BeginInvoke(新操作(()=>cbMachines.SelectedIndex=0));既然同步指定所选索引与异步工作一样,为什么我需要异步?第二,使其可编辑的工作对我来说也一样,但我不想编辑它。。。“名字”不是真名,我想在问题中改一下,谢谢!
<UserControl.ContentTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Parent.MachineName}" />
    </DataTemplate>
</UserControl.ContentTemplate>
Content="{Binding SelectedItem.MachineName, RelativeSource={RelativeSource Mode=TemplatedParent}}"
cbMachines.ApplyTemplate();
var contentPresenter = cbMachines.Template.FindName("contentPresenter", cbMachines) as ContentPresenter;
System.Windows.Data.BindingOperations.SetBinding(contentPresenter, ContentPresenter.ContentProperty, new Binding("SelectedItem.MachineName") { Source = cbMachines });
contentPresenter.ContentTemplateSelector = null;