2015-09-04 6 views
1

Я спросил this вопрос в октябре 2012 года, когда я работал над приложением Windows. теперь, когда я перехожу к WPF-приложению, я снова получаю ту же проблему. i.e Как получить выбранные значения строк DevExpress GridControl в WPF? Я не нашел свой ответ в Google, и ни один из ответов в вышеупомянутой ссылке не работает. нет ничего похожего на событие CellClick, RowClick или RowCellClick в gridview управления devexpress из wpf, как и в gridformcont winform. Я буду рад, если кто-то может решить эту проблемуКак получить выбранные значения строк DevExpress GridControl в WPF?

Редактировать

Я обновил свое заявление с требуемыми пространствами имен, как вы обновили в своем ответе, но проблема остается той же. Я получаю следующие ошибки буксирные в

<Grid.DataContext> 
     <dxmvvm:ViewModelSource Type="{x:Type local:EntitiesViewModel}"/> 
    </Grid.DataContext> 

1- 'dxmvvm: ViewModelSource' типа "не был найден в dxmvvm: ViewModelSource

2- название "EntitiesViewModel" не существует в пространстве имен" CLR -namespace: DXApplication1"

мое кодирование приложение выглядит следующим образом

XAML

<dx:DXWindow 
    x:Class="DXApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:DXApplication1" 
    xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" 
    xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" 
    xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" 
    xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm" 
    Title="DXApplication" Height="700" Width="1100" 
    SnapsToDevicePixels="True" UseLayoutRounding="True"> 

    <dx:DXWindow.Resources> 
    </dx:DXWindow.Resources> 

    <Grid Margin="12"> 
     <Grid.DataContext> 
      <dxmvvm:ViewModelSource Type="{x:Type local:EntitiesViewModel}"/> 
     </Grid.DataContext> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid Grid.Row="0" Margin="0,0,0,8"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="8"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <Label Content="Item1" Grid.Row="0" VerticalAlignment="Center"/> 
      <Label Content="Item2" Grid.Row="1" VerticalAlignment="Center"/> 
      <Label Content="Item3" Grid.Row="2" VerticalAlignment="Center"/> 
      <dxe:TextEdit Text="{Binding SelectedEntity.Item1}" Grid.Row="0" Grid.Column="2"/> 
      <dxe:TextEdit Text="{Binding SelectedEntity.Item2}" Grid.Row="1" Grid.Column="2"/> 
      <dxe:TextEdit Text="{Binding SelectedEntity.Item3}" Grid.Row="2" Grid.Column="2"/> 
     </Grid> 
     <dxg:GridControl Grid.Row="1" 
        AutoGenerateColumns="None" 
        ItemsSource="{Binding Entities}" 
        SelectedItem="{Binding SelectedEntity}"> 
      <dxg:GridControl.Columns> 
       <dxg:GridColumn FieldName="Item1"/> 
       <dxg:GridColumn FieldName="Item2"/> 
       <dxg:GridColumn FieldName="Item3"/> 
      </dxg:GridControl.Columns> 
      <dxg:GridControl.View> 
       <dxg:TableView ShowTotalSummary="True" AllowEditing="False"/> 
      </dxg:GridControl.View> 
     </dxg:GridControl> 
    </Grid> 
</dx:DXWindow> 

EntitiesViewModel

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Collections.ObjectModel; 

namespace DXApplication1 
{ 
    public class EntitiesViewModel 
    { 
     public EntitiesViewModel() 
     { 
      LoadEntities(); 
     } 
     void LoadEntities() 
     { 
      Entities = new ObservableCollection<Entity> 
     { 
      new Entity(){ Item1="A", Item2="A0", Item3="A00"}, 
      new Entity(){ Item1="B", Item2="B0", Item3="B00"}, 
      new Entity(){ Item1="C", Item2="C0", Item3="C00"}, 
     }; 
     } 
     public ObservableCollection<Entity> Entities { get; private set; } 
     public virtual Entity SelectedEntity { get; set; } // Bindable property 
    } 
    public class Entity 
    { 
     public string Item1 { get; set; } 
     public string Item2 { get; set; } 
     public string Item3 { get; set; } 
    } 
} 

Изображение для библиотек, ошибки, класс и т.д.

enter image description here

+0

В WPF неправильный способ использования событий для получения значений из сетки и распространения этих значений в редакторах, а не просто использование привязок данных ... – DmitryG

+0

@Dmitry это не правильный способ ответить на wpf biginer , вы должны правильно ответить на пример кода, поскольку nempo сделал так, чтобы можно было следовать вашему пути. говорить, чтобы biginer использовать привязку данных не достаточно – kashif

+0

Все, что я хочу, просто мешает вам использовать привычные подходы, несмотря на изменение целевой платформы, вместо того, чтобы изучать платформу ... Правильный способ - задать правильные вопросы и продемонстрировать ваши попытки и результаты ... – DmitryG

ответ

0

Посмотрите на тему выбора в документации на DevExpress Домашняя страница: Grid Selection Topic

Если вы используете шаблон MVVM вы также должны посмотреть на SelectedItems Property. Пример там показано, как привязать к выбранным пунктам:

<dxg:GridControl ItemsSource="{Binding Source}" SelectedItems="{Binding Selection}"> 
+0

Не могли бы вы создать пример – kashif

2

Вы можете использовать DataControlBase.CurrentItemChanged событие.
Вот пример:
WPF: обработчик

<dxg:GridControl x:Name="gridControl1" ItemsSource="{Binding Data}" CurrentItemChanged="gridControl1_CurrentItemChanged"> 
</dxg:GridControl> 

Событие:

private void gridControl1_CurrentItemChanged(object sender, CurrentItemChangedEventArgs e) 
{ 
    TBGRNo.Text = gridControl1.GetFocusedRowCellValue("GRNo").ToString(); 
    TBSName.Text = gridControl1.GetFocusedRowCellValue("SName").ToString(); 
    TBFName.Text = gridControl1.GetFocusedRowCellValue("FName").ToString();  
} 
+0

@kashif Да, в WPF есть метод GridControl.GetFocusedRowCellValue', а в WinForms есть метод GridView.GetFocusedRowCellValue. – nempoBu4

+0

Если в girdview есть одна строка, решение, которое вы предоставили, не работает. – kashif

0

Я нашел решение, как следует

<Grid> 
    <dxg:GridControl Name="gridcontrol" AutoGenerateColumns="AddNew" HorizontalAlignment="Left" Margin="23,139,0,0" VerticalAlignment="Top" Height="315" Width="575"> 
     <dxg:GridControl.Columns> 
      <dxg:GridColumn FieldName="Item1"/> 
      <dxg:GridColumn FieldName="Item2"/> 
      <dxg:GridColumn FieldName="Item3"/> 
     </dxg:GridControl.Columns> 
     <dxg:GridControl.View> 
      <dxg:TableView Name="gridview" ShowTotalSummary="True" AllowEditing="False"/> 
     </dxg:GridControl.View> 
    </dxg:GridControl> 
    <dxe:TextEdit Name="TBItem1" Text="{Binding SelectedItem.Item1, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,10,0,0" VerticalAlignment="Top" Width="150"/> 
    <dxe:TextEdit Name="TBItem2" Text="{Binding SelectedItem.Item2, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,49,0,0" VerticalAlignment="Top" Width="150"/> 
    <dxe:TextEdit Name="TBItem3" Text="{Binding SelectedItem.Item3, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,84,0,0" VerticalAlignment="Top" Width="150"/> 
    <Label Content="Item1" HorizontalAlignment="Left" Margin="61,10,0,0" VerticalAlignment="Top" Width="48"/> 
    <Label Content="Item2" HorizontalAlignment="Left" Margin="61,49,0,0" VerticalAlignment="Top"/> 
    <Label Content="Item3" HorizontalAlignment="Left" Margin="61,80,0,0" VerticalAlignment="Top"/> 
</Grid> 
+0

@ Димитрий сейчас хорошо? если да, то я действительно большой плюс – kashif

+0

Привет! Теперь для меня это выглядит намного лучше, но есть некоторые моменты для улучшения (сильные зависимости между элементами управления View, «фиксированный» макет) ... Взгляните на мой ответ, пожалуйста. – DmitryG

0

Насколько я могу видеть вы хотите отобразить список объектов, затем предоставить пользовательский интерфейс для выбора одного из этих средств (через gridcontrol) и отредактировать выбранные свойства объекта в отдельном представлении (через текстовые редакторы).

Итак, я предлагаю вам использовать подход MVVM. И поскольку вы уже используете элементы управления DevExpress, я предлагаю вам использовать DevExpress MVVM Framework, чтобы сделать ваш MVVM максимально простым.

Шаг 1: Определение класса ViewModel, который содержит коллекцию Entities доступной через Entities собственности (Вы можете загрузить эти объекты в пути, как это требуется, от него требуется, и когда оно необходимо) и обеспечить SelectedEntity свойства:

public class EntitiesViewModel { 
    public EntitiesViewModel() { 
     LoadEntities(); 
    } 
    void LoadEntities() { 
     Entities = new ObservableCollection<Entity> 
     { 
      new Entity(){ Item1="A", Item2="A0", Item3="A00"}, 
      new Entity(){ Item1="B", Item2="B0", Item3="B00"}, 
      new Entity(){ Item1="C", Item2="C0", Item3="C00"}, 
     }; 
    } 
    public ObservableCollection<Entity> Entities { get; private set; } 
    public virtual Entity SelectedEntity { get; set; } // Bindable property 
} 
public class Entity { 
    public string Item1 { get; set; } 
    public string Item2 { get; set; } 
    public string Item3 { get; set; } 
} 

Шаг 2: Определить вид макета следующим образом:

... 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:DXApplication1" 
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" 
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" 
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" 
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm" 
... 
<Grid Margin="12"> 
    <Grid.DataContext> 
     <dxmvvm:ViewModelSource Type="{x:Type local:EntitiesViewModel}"/> 
    </Grid.DataContext> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="0" Margin="0,0,0,8"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="8"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <Label Content="Item1" Grid.Row="0" VerticalAlignment="Center"/> 
     <Label Content="Item2" Grid.Row="1" VerticalAlignment="Center"/> 
     <Label Content="Item3" Grid.Row="2" VerticalAlignment="Center"/> 
     <dxe:TextEdit Text="{Binding SelectedEntity.Item1}" Grid.Row="0" Grid.Column="2"/> 
     <dxe:TextEdit Text="{Binding SelectedEntity.Item2}" Grid.Row="1" Grid.Column="2"/> 
     <dxe:TextEdit Text="{Binding SelectedEntity.Item3}" Grid.Row="2" Grid.Column="2"/> 
    </Grid> 
    <dxg:GridControl Grid.Row="1" 
        AutoGenerateColumns="None" 
        ItemsSource="{Binding Entities}" 
        SelectedItem="{Binding SelectedEntity}"> 
     <dxg:GridControl.Columns> 
      <dxg:GridColumn FieldName="Item1"/> 
      <dxg:GridColumn FieldName="Item2"/> 
      <dxg:GridColumn FieldName="Item3"/> 
     </dxg:GridControl.Columns> 
     <dxg:GridControl.View> 
      <dxg:TableView ShowTotalSummary="True" AllowEditing="False"/> 
     </dxg:GridControl.View> 
    </dxg:GridControl> 
</Grid> 

* Основные моменты, представляющей интерес и приемы:
1) создание EntitiesViewModel через ViewModelSource. Этот способ позволяет не реализовывать интерфейс INotifyPropertyChanged на уровне ViewModel - вы сможете просто объявить SelectedEntity собственности как virtual и передать всю грязную-работу в POCO mechanism:

<dxmvvm:ViewModelSource Type="{x:Type local:EntitiesViewModel}"/> 

2) все View»контролируют Привязку «смотрит» в DataContext (который содержит наш ViewModel):

... 
Text="{Binding SelectedEntity.Item1}" 
... 
ItemsSource="{Binding Entities}" 
SelectedItem="{Binding SelectedEntity}"> 

Этот способ позволяет отделить все UI-элементы управления друг от друга и изменить вид с легким.

+0

im get error hear можете ли вы предоставить полный код xaml – kashif

+0

@kashif У меня есть обновил мой ответ с помощью необходимых пространств имен xaml (пожалуйста, также убедитесь, что библиотека DevExpress.Mvvm.vXX.X.dll добавлена ​​в ссылки на проекты). – DmitryG

+0

Извините, что снова вас раздражает. Мне очень любопытно и с энтузиазмом изучать то, что вы наставляете. проблема все еще сохраняется. можете ли вы загрузить свой проект где-нибудь для загрузки. plzz см. мой отредактированный вопрос для моей проблемы – kashif