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()