2

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

<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);
    }

当我在代码中设置 ItemsSource 时,它​​工作正常,但我想在 Xaml 中设置 ItemsSource,但是使用上面的 Xaml 不起作用。我也尝试将其设置为 Path = ""。有人知道为什么吗?

谢谢

4

4 回答 4

3

您需要将 DataContext 分配给控件。就像是:

var window = new Window1();
window.DataContext = new WindowDC();
window.Show();

其中Window1类包含组合框,WindowDC 就像:

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

这就是它的工作原理。

您实际上要做的是collection放入控件类,并将数据上下文设置为仅组合框。

但是,出于测试目的,您仍然可以在控件构造函数中设置 Combox.Datacontext。

于 2011-06-09T11:52:54.923 回答
2

WPF 中的绑定总是有一个 Source。如果您没有在绑定本身中指定源,那么它将隐式使用控件的 DataContext 或其祖先。因此,如果要绑定到代码隐藏文件中的属性,则必须将 DataContext 设置为包含该collection属性的类的对象。在您的情况下,这是 Window ( this) 的实例。

数据上下文 = 这个;

正如评论者指出的那样,将业务逻辑或数据放在文件背后的代码中并不是一种好的风格。所以考虑编写一个单独的类,它包含你的collection属性,你可以用它来初始化你的DataContext. 如果你正在编写更大的应用程序,你应该看看像 MVVM 这样的模式,它使用数据绑定在你的视图和模型之间提供更好的分离。

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

于 2011-06-09T11:52:18.413 回答
0

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

在后面的代码中也做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");
    }
于 2011-06-09T11:58:21.827 回答
0

当您在后面的代码中设置组合的项目源时,它正在工作,因为组合的源正在更新,就像在 XAML 中设置项目源一样,您必须使用 INotifyPropertyChanged 创建一个属性,每次更新您的集合时都会更新组合的 itemsource通过这个属性..

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

现在,当您在按钮单击时填充集合时,您只需将该集合在属性中设置为..

 _Collection = new ObservableCollection<Foo>();
 Foo f = new Foo("DSD");
 _Collection .Add(f);
  Collection = _Collection ; //here property call OnPropertyChange 

同样,您可以向任何控件提供数据。它只是 INotifyPropertyChanged 属性的游戏。希望对你有帮助

于 2011-06-09T14:10:10.790 回答