2013-10-26 11 views
1

У меня есть Datagrid с 2 столбцами item, Purchase Rate соответственно. Столбец Item - столбец DatagridCombobox. Теперь я хочу добавить все элементы в это поле со списком из таблицы данных Item. Я связываю его, а также Как представить коллекцию предметов в моем объекте?wpf Datagrid: Combobox Интеграция в wpf datagrid

MY 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"); 
     } 
    } 
} 
+0

У меня есть один вопрос? это ваше требование - просто отобразить ставку покупки выбранного товара или вам нужно сделать больше.? Если это так, не используйте сетку данных, просто используйте comboBox и textBox, привяжите List to ComboBox и на основе выбора выберите значение purachase в текстовом поле из модели представления. Изменить тип ProductName в список создать список всех названий продуктов – Kumareshan

+0

Моей DataGrid также имеет другие столбцы, как сумма, скидка, общие и т.д. – Mussammil

+0

Во время, если ваши отображающей деталь только одного элемента, то есть только поле со списком и количество текстовых полей для отображения деталей выбранного элемента. Это упростит вам – Kumareshan

ответ

0

Вы должны были бы bindto ObservableCollection<T>.

Сначала вы добавили все элементы из своей базы данных в ObservableCollection<clsItem> Свойство в вашей модели ViewModel или Code (не знаю, используете ли вы 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> 

Что мы делаем здесь? Сначала мы устанавливаем DataContext окна самому себе (в MVVM вместо этого вы привязываетесь к ViewModel). При этом мы можем получить доступ к общедоступным свойствам окна. Вторым мы устанавливаем свойство ItemsSource свойства ComboBox на свойство ObservableCollection, которое мы определили в файле CodeBehind. В-третьих, мы установили путь DisplayMember в свойство ProductName. Если бы мы не сделали этого, ComboboBox просто отобразил WPFApplication1.clsItems, а не имя элемента в коллекции. И наконец, мы установили SelectedIndex в ноль, чтобы ComboBox отобразил элемент. Конечно, вы также можете привязать SeletedIndex (или лучше SelectedItem) к Property в коде за файлом и продолжить обработку данных, которые пользователь выбирает

С этим вам остается только изменить базовую коллекцию, и она будет автоматически отражать ComboBox в представлении.

Надеюсь, это поможет. Вы можете найти больше на привязке данных HERE

P.S. Я бы переименовал clsItems только в Items, должно быть ясно, что Items - это класс.

+0

Но я использую combobox в качестве столбца datagridCombobox. Весь мой datagrid связывается с коллекцией объектов.На самом деле я хочу загрузить столбец с некоторой коллекцией, которая из моей таблицы базы данных – Mussammil

+0

Я не понимаю, что вы говорите. У вас есть ComboBox в Datagrid? Если yo, это не имеет значения, поскольку привязка остается прежней. Или у вас есть Datagrid внутри вашего ComboBox? – Ruhrpottpatriot

+0

Итак, я взял ваш код и бросил его в свою среду. Я изменил его, и теперь он отображает имя и скорость покупки в datagrid. Я думаю, ваша ошибка заключалась в использовании ComboBoxColumn. Надеюсь, именно так вы хотите это сделать. Если нет, оставьте комментарий, как вы хотите это сделать, и я помогу вам. – Ruhrpottpatriot

Смежные вопросы