1

我有一个包含 2 列项目的 Datagrid,分别是购买率。项目列是一个 DatagridCombobox 列,现在我想从我的项目数据库表中将所有项目添加到该组合框。如何绑定它,以及如何表示项目在我的对象中收集?

我的 Xaml 是:

 <my:DataGrid Name="dgReceiveInventory" ItemsSource="{Binding}"   SelectionUnit="Cell"   AutoGenerateColumns="False"  >
      <my:DataGrid.Columns>
        <!--3-Product Column-->
                    <my:DataGridComboBoxColumn  Header="Product Name" Width="200" Binding="{Binding ProductName}" IsReadOnly="True"> <my:DataGridComboBoxColumn
       <!--7-Purchase Rate Column-->
                    <my:DataGridTextColumn Header="Purchase Rate" ElementStyle="{StaticResource TextBlockContentRightAlign}" Width="100" Binding="{Binding PurchaseRate}" IsReadOnly="True"></my:DataGridTextColumn>
      </my:DataGrid.Columns>
 </my:DataGrid>

我的课是:

 class clsItems : INotifyPropertyChanged, IDataErrorInfo
{
     private string _ProductName;
     private decimal _PurchaseRate;

    public string ProductName
    {
        get { return _ProductName; }
        set
        {
            _ProductName = value;
            OnPropertyChanged("ProductName");
        }
    }

    public decimal PurchaseRate 
    {
        get { return _PurchaseRate; }
        set
        {
            _PurchaseRate = value;
            OnPropertyChanged("PurchaseRate");
        }
    }
}
4

1 回答 1

0

你必须绑定到一个ObservableCollection<T>.

首先,您将数据库中的所有项目添加到ObservableCollection<clsItem>ViewModel 或 Code behind 中的属性中(不知道您是否使用 MVVM,但我强烈推荐它)。然后您将 DataBind 到您的 ViewModel 或后面的代码。之后,您将ItemsSource属性设置为ObservableCollection.

这是一个非常简单的示例代码(不在 MVVM 中):

代码背后:

public partial class MainWindow : Window
{
    //This is the Collection you will DataBind your ComboBox to
    public ObservableCollection<clsItems> ItemsCollection { get; set; }

    public MainWindow()
    {
        this.ItemsCollection = new ObservableCollection<clsItems>
        {
            new clsItems()
            {
                ProductName = "Product 1",
                PurchaseRate = 10
            },
            new clsItems()
            {
                ProductName = "Product 2",
                PurchaseRate = 20
            }
        };

        InitializeComponent();
    }
}

XAML 文件:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <StackPanel>
        <DataGrid
                  ItemsSource="{Binding Path=ItemsCollection}"
                  SelectionUnit="Cell"
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
                <!--3-Product Column-->
                <DataGridTextColumn  Header="Product Name"
                                         Width="200"
                                         IsReadOnly="True"
                                         Binding="{Binding ProductName}">
                    <!--7-Purchase Rate Column-->
                </DataGridTextColumn>
                <DataGridTextColumn Header="Purchase Rate"
                                    Width="100"
                                    Binding="{Binding PurchaseRate}"
                                    IsReadOnly="True">
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel>
</Window>

我们在这里做什么?首先,我们将DataContextWindow 设置为自身(在 MVVM 中,您将绑定到 ViewModel)。这样我们就可以访问窗口的公共属性。其次,我们将ItemsSourceComboBox 的属性设置为我们在 CodeBehind 文件中定义的 ObservableCollection 属性。第三,我们将 DisplayMember Path 设置为ProductName属性。如果我们不这样做,ComboboBox 将只显示 WPFApplication1.clsItems,而不是集合中项目的名称。最后,我们将 设置SelectedIndex为零,这样 ComboBox 将显示一个项目。当然,您也可以将 SeletedIndex(或更好的 SelectedItem)数据绑定到代码隐藏文件中的属性,并进一步处理用户选择的数据

这样,您只需更改基础集合,它就会自动反映在视图中的 ComboBox 中。

我希望这有帮助。您可以在此处找到有关数据绑定的更多信息

PS 我将 clsItems 重命名为 Items,应该清楚 Items 是一个类。

于 2013-10-26T12:50:52.313 回答