WPF:comboBox数据绑定问题

时间:2015-06-30 21:27:06

标签: c# wpf data-binding

我有一个public class LPosition,其中包含一个属性public String OZ { get; set; }。应用程序读取.txt和.xml文件,OZ从这些文件中获取值。我需要将OZ绑定到comboBox:

<ComboBox x:Name="OZs" SelectionChanged="OZs_SelectionChanged" Margin="-10,0,10,1" Grid.Column="0" Grid.Row="1" Height="27" VerticalAlignment="Bottom">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding OZ}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

如您所见,我尝试使用DataTemplate实现数据绑定,但它并不起作用。我知道可以用ItemsSource实现数据绑定,但为此我需要一个ObservableCollection,我没有,我也不知道如何从OZ创建它。我看过许多ObservableCollection硬编码的例子,我知道如何在硬编码的情况下使用它,但我不知道在我的情况下该做什么。
很抱歉,如果说明不明确,我对WPF很新。而且我对这个问题很失落。任何帮助,将不胜感激。

编辑:根据@ Xiaoy312的回答,我添加了以下代码:

public IEnumerable<LPosition> OZList { get; set; } 

public FormelAssistent()
{
    InitializeComponent();
    this.DataContext = this;
    OZs.ItemsSource = OZList;
}

和XAML:

<ComboBox x:Name="OZs"
          SelectionChanged="OZs_SelectionChanged"
          Margin="-10,0,10,1"
          Grid.Column="0"
          Grid.Row="1"
          Height="27"
          VerticalAlignment="Bottom"
          ItemsSource="{Binding OZList}"
          DisplayMemberPath="OZ" />

但它不起作用:(

2 个答案:

答案 0 :(得分:0)

您需要提供ComboBox的内容列表(选项),以便通过其ItemsSource属性进行选择。您不一定需要使用ObservableCollection支持它。仅当您计划在呈现视图时添加/删除集合时。任何IEnumerable也可以。

<ComboBox x:Name="OZs"
          ItemsSource="{Binding ListOrIEnumerableOfLPosition}"
          DisplayMemberPath="OZ" <- you can also use this instead of setting an item template, unless you need something complex
          ...>
    ...
</ComboBox >

答案 1 :(得分:0)

如果您在类上实现INotifyPropertyChanged接口,那么它应该可以正常工作。

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(string PropertyName = "")
{
    if(PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }
}

private IEnumerable<string> _oz;
public IEnumerable<string> Oz
{
    get
    {
        return _oz;
    }
    set
    {
        _oz = value;
        NotifyPropertyChanged("Oz");
    }
}

如果您碰巧使用依赖项对象,则可以改为使用依赖项属性。如果有选择,这将是我的首选方案。

public IEnumerable<string> Oz
{
    get { return (IEnumerable<string>)GetValue(OzProperty); }
    set { SetValue(OzProperty, value); }
}

public static readonly DependencyProperty OzProperty = DependencyProperty.Register("Oz", typeof(IEnumerable<string>), typeof(MainWindow), new PropertyMetadata(null));  

值得指出的是,如果容器没有实现INotifyCollectionChanged(例如ObservableCollection),那么当整个列表被替换为ComboBox时,您只会看到ObservableCollection的更新分配

如果你真的不能使用-- Pivot table with one row and five columns SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] FROM (SELECT DaysToManufacture, StandardCost FROM Production.Product) AS SourceTable PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable; ,你可以在get和set中通知。