C# WPF ItemsSource在代码隐藏中工作,但不在XAML中工作

C# WPF ItemsSource在代码隐藏中工作,但不在XAML中工作,c#,wpf,itemssource,C#,Wpf,Itemssource,我有一个简单的组合框,里面有一个复选框: <ComboBox Height="23" HorizontalAlignment="Left" Margin="158,180,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding collection}"> <ComboBox.ItemTemplate> <DataTempla

我有一个简单的组合框,里面有一个复选框:

<ComboBox Height="23" HorizontalAlignment="Left" Margin="158,180,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding collection}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox Content="{Binding Name}"></CheckBox>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

datacontext只是隐藏的代码,为了测试它,我使用以下代码:

public ObservableCollection<Foo> collection { get; set; }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        collection = new ObservableCollection<Foo>();
        this.comboBox1.ItemsSource = collection;
        Foo f = new Foo("DSD");
        collection.Add(f);
    }
publicobservableCollection集合{get;set;}
私有无效按钮1\u单击(对象发送者,路由目标)
{
集合=新的ObservableCollection();
this.comboBox1.ItemsSource=集合;
Foo f=新的Foo(“DSD”);
增加(f);
}
当我在代码中设置ItemsSource时,它可以正常工作,但是我想在Xaml中设置ItemsSource,但是使用上面的Xaml它不起作用。我还尝试将其设置为Path=”“。有人知道为什么吗


谢谢,WPF中的绑定总是有一个源代码的。如果不在绑定本身中指定源,那么它将隐式使用控件的DataContext或其祖先。因此,如果要绑定到codebehind文件中的属性,则必须将DataContext设置为包含
集合
属性的类的对象。在您的例子中,这是窗口的实例(
this

DataContext=this

正如评论员所指出的,将业务逻辑或数据放在代码隐藏文件中并不被认为是好的风格。因此,考虑编写一个单独的类,该类包含您的代码>集合< /代码>属性,您可以使用它来初始化您的<代码> DATACONTEXT/<代码>。如果您正在编写更大的应用程序,您应该看看MVVM之类的模式,它使用数据绑定在视图和模型之间提供更好的分离


编辑:更改顺序并合并反馈

您需要将DataContext分配给控件。比如:

var window = new Window1();
window.DataContext = new WindowDC();
window.Show();
其中
Window1
类包含组合框,WindowDC类似于:

public class WindowDC
{ 
   public ObservableCollection<Foo> collection { get; set; }
}
公共类WindowDC
{ 
公共ObservableCollection集合{get;set;}
}
这就是工作原理

您实际要做的是将
集合
放入控件类,并仅为combobox设置datacontext


但是,出于测试目的,您仍然可以在control Constructor中设置Combox.Datacontext。

确保您的代码中存在公共属性
集合

在代码隐藏中也执行
this.DataContext=this

最后,实现
INotifyPropertyChanged
,告诉视图一旦在集合中添加了项,您就已经更改了集合

public ObservableCollection<Foo> Collection 
{ 
get
    {
    return collection;
    }
 set
    {
    collection = value;
    OnPropertyChanged("Collection");

    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        collection = new ObservableCollection<Foo>();
        //this.comboBox1.ItemsSource = collection;
        Foo f = new Foo("DSD");
        collection.Add(f);
        OnPropertyChanged("Collection");
    }
公共可观测集合集合
{ 
得到
{
回收;
}
设置
{
收集=价值;
不动产变更(“收款”);
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
集合=新的ObservableCollection();
//this.comboBox1.ItemsSource=集合;
Foo f=新的Foo(“DSD”);
增加(f);
不动产变更(“收款”);
}

当您在代码隐藏中设置combo的项目源时,它会起作用,因为combo的源会像wise一样更新。要在XAML中设置项目源,您必须使用INotifyPropertyChanged创建一个属性,该属性在每次通过此属性更新集合时都会不断更新combo的项目源

 private ObservableCollection<Foo> _Collection;
 public ObservableCollection<Foo> Collection 
{ 
get
{
return collection;
}
 set
{
collection = value;
OnPropertyChanged("Collection");
}
private-observeCollection\u-Collection;
公开收集
{ 
得到
{
回收;
}
设置
{
收集=价值;
不动产变更(“收款”);
}
现在,当您在按钮上填充集合时,只需在属性中将该集合设置为

 _Collection = new ObservableCollection<Foo>();
 Foo f = new Foo("DSD");
 _Collection .Add(f);
  Collection = _Collection ; //here property call OnPropertyChange 
\u Collection=新的ObservableCollection();
Foo f=新的Foo(“DSD”);
_增加(f);
Collection=\u Collection;//此处是对PropertyChange的属性调用
和wise一样,您可以向任何控件提供数据。这是INotifyPropertyChanged属性的游戏。
希望这能帮助你不要这样做。这是错误的,它打破了DataContext的整个概念,DataContext被用来区分业务逻辑和perperperation。不,不,我认为给我一个否决票是不公平的。这个问题没有任何上下文关联。他只想知道为什么他的样本不起作用,我给了他答案缺少链接。我们不在这里讨论概念证明的架构。它是一个例子,它不需要解释如何使用MVVM或类似的东西。请考虑收回这个投票。在任何情况下,我都加入了你的反馈,并在原来的回答中添加了注释。NoFiffyPrimTyType不是必需的。Datacontext不是Chan.ged in按钮_click()