C# WPF设置数据上下文

C# WPF设置数据上下文,c#,wpf,xaml,combobox,datacontext,C#,Wpf,Xaml,Combobox,Datacontext,我试图学习WPF和绑定,但似乎无法理解正在发生的事情。我使用组合框复制了一个代码示例,并尝试对其进行修改以查看发生了什么。问题似乎在于设置datacontext。如果我在InitializeComponent()之后设置它;使用DataContext=this;一切都很好。但是,我无法使示例与任何其他DataContext设置一起使用。我试过了 DataContext="{Binding RelativeSource={RelativeSource Self}}" Name="_this" D

我试图学习WPF和绑定,但似乎无法理解正在发生的事情。我使用组合框复制了一个代码示例,并尝试对其进行修改以查看发生了什么。问题似乎在于设置datacontext。如果我在InitializeComponent()之后设置它;使用DataContext=this;一切都很好。但是,我无法使示例与任何其他DataContext设置一起使用。我试过了

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Name="_this" DataContext="{Binding ElementName=_this}"
我的组合框中没有数据

背后的代码是:

cbItems = new ObservableCollection<ComboBoxItem>();
            var cbItem = new ComboBoxItem { Content = "All" };
            SelectedItem = cbItem;
            cbItems.Add(cbItem);
            var items = (from a in dc.Counties
                select a.CountyName).ToList();

            foreach (var item in items)
            {
                //cbItems.Add(cbItem);
                cbItems.Add(new ComboBoxItem{Content = item});
            }
cbItems=新的ObservableCollection();
var cbItem=new ComboBoxItem{Content=“All”};
选择editem=cbItem;
cbItems.Add(cbItem);
变量项=(来自dc.县的a)
选择a.CountyName).ToList();
foreach(项目中的var项目)
{
//cbItems.Add(cbItem);
添加(新ComboBoxItem{Content=item});
}
xaml是

<ComboBox x:Name="ComBoCounty" HorizontalAlignment="Left" Margin="44,38,0,0" VerticalAlignment="Top"
                  Width="120" ItemsSource="{Binding cbItems}" SelectedItem="{Binding SelectedcbItem}"
                  Loaded="ComBoCounty_OnLoaded" SelectionChanged="ComBoCounty_OnSelectionChanged" Height="20" />


我使用ReSharper,它会指示错误,并对DataContext值提出建议。我在组合框中没有数据的情况下尝试了所有这些方法。这似乎是需要理解的最基本的事情之一,我花了很多时间试图理解它。如果有人能告诉我一种不用在xaml中设置DataContext的方法,以及它的工作原理,我将不胜感激

itemsSource您可以将DataContext绑定到您的窗口
(这与您在代码中尝试的设置DataContext=this相同):



要设置哪种类型的数据上下文?另一节课?DC应用于整个Xaml,除非您显式更改它。你能检查VS中的输出窗口中是否存在绑定错误(在运行应用程序时)?这个问题的完美答案是:谢谢,这是成功的!所以RelativeSource正在树上查找窗口。如果这是多窗口应用程序的一部分,它会找到当前活动窗口并停止吗?我认为该树适用于整个应用程序,而不仅仅是当前窗口。非常感谢您的帮助。它将使用控件所在的窗口,使用第一个匹配项。顺便说一句,这只是一个可能的解决方案,作为替代方案,您也可以使用定义为资源的DataContext。例如,我尝试移动到具有多个ComboBoxs、DataGrids等的更大应用程序,但上述解决方案不起作用。在输出窗口中,我收到错误:System.Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.ItemsControl',AncestorLevel='1'的绑定源。BindingExpression:Path=VerticalContentAlignment;DataItem=null;目标元素是“ComboBoxItem”(名称=“”);目标属性为“VerticalContentAlignment”(类型为“VerticalAlignment”)。这没有足够的信息进行分析,能否提供XAML?
    <Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
       <ComboBox ItemsSource="{Binding Path=cbItems}" ...></ComboBox>
    </Grid>