2016-01-26 2 views
0

Мне нужна ваша помощь с WPF Datagrid. Я посмотрел на некоторые ответы на вопросы в платформе и сделал что-то подобное, но не могу решить некоторые проблемы.WPF Datagrid Связывание с Combobox и текстовым полем

Я STRUCT назван таблице

public struct Table 
{ 
    public string Name { get; set; } 
    public int Value { get; set; } 
} 

и класса им, как номер

public class Room : INotifyPropertyChanged 
{ 
    public string strRoomlName; 
    public string Name 
    { 
     get { return strRoomlName; } 
     set { strRoomlName = value; } 
    }    
    public ObservableCollection<Table> tbTables = new ObservableCollection<Table>(); 
    public ObservableCollection<Table> PrpTables 
    { 
     get { return tbTables; } 
     set 
     { 
      tbTables = value; 
      OnPropertyChanged("PrRawValues"); 
      if (value != null && value.Count > 0) 
      { 
       PrpSelectedTable = value.First(); 
      } 
     } 
    } 
    private Table selectedTable; 
    public Table PrpSelectedTable 
    { 
     get 
     { 
      return selectedTable; 
     } 
     set 
     { 
      selectedTable = value; 
      OnPropertyChanged("PrpSelectedTable"); 
      ComboValue = value.Value; 
      OnPropertyChanged("ComboValue");  
     } 
    } 
    public int ComboValue 
    { 
     get; 
     set; 
    }   
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    }  
} 

и главный класс следующим образом,

public partial class MainWindow : Window 
{ 
    ObservableCollection<Room> rooms; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     rooms = new ObservableCollection<Room>(); 

     Table t1 = new Table { Name = "Table #1", Value = 0 }; 
     Table t2 = new Table { Name = "Table #2", Value = 3 }; 
     Table t3 = new Table { Name = "Table #3", Value = 5 }; 
     Table t4 = new Table { Name = "Table #4", Value = 2 }; 

     Room rm1 = new Room(); 
     rm1.Name = "Small Hall"; 
     rm1.tbTables.Add(t1); 
     rm1.tbTables.Add(t2); 
     rm1.tbTables.Add(t3); 
     rm1.tbTables.Add(t4); 
     rooms.Add(rm1); 

     Table t21 = new Table { Name = "Table #1", Value = 0 }; 
     Table t22 = new Table { Name = "Table #2", Value = 3 }; 
     Table t23 = new Table { Name = "Table #3", Value = 5 }; 
     Table t24 = new Table { Name = "Table #4", Value = 12 }; 
     Table t25 = new Table { Name = "Table #5", Value = 8 }; 
     Table t26 = new Table { Name = "Table #6", Value = 3 }; 
     Table t27 = new Table { Name = "Table #7", Value = 20 }; 


     Room rm2 = new Room(); 
     rm2.Name = "Main Hall"; 
     rm2.tbTables.Add(t21); 
     rm2.tbTables.Add(t22); 
     rm2.tbTables.Add(t23); 
     rm2.tbTables.Add(t24); 
     rm2.tbTables.Add(t25); 
     rm2.tbTables.Add(t26); 
     rm2.tbTables.Add(t27); 
     rooms.Add(rm2); 


     this.gridSignals.DataContext = rooms; 
    } 

XAML Layout:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Custom="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon" x:Class="BindingReiview.MainWindow" 
    Title="MainWindow" Height="320" Width="396"> 
<StackPanel Height="266" VerticalAlignment="Top" Margin="0,0,2,0"> 
    <DataGrid ItemsSource="{Binding}" Name="gridSignals" CanUserAddRows="False" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header=" Room " Binding="{Binding Name}" Width="110"/> 
      <DataGridTemplateColumn Header=" Tables " Width="100" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding PrpTables, Mode=TwoWay}" SelectedIndex="0" SelectedItem="{Binding PrpSelectedTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
          DisplayMemberPath="Name" Name="cmbVal" ></ComboBox> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn Header=" Geust(s)" Width="100"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding ComboValue}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn>    
     </DataGrid.Columns> 
    </DataGrid> 
</StackPanel> 

ObservableCollection привязан к источнику данных сетки. Комбинированные предметы привязаны к Room, где есть ObservableCollection. При выборе таблицы Количество гостей отображается в текстовом поле. Поскольку текст Textbox привязан к ComboValue (Combobox.SelectedItem).

UI Example

Итак, мне нужно изменить гостей выбранной таблицы. Например (на рисунке), в таблице № 5 значение равно 8, и его необходимо изменить, редактируя текстовое поле.

Любая помощь и предложения приветствуются!

ответ

0

Вы хотите обновить значение в свойстве переменной Value в выбранной таблице (переменная t25 в вашем коде/примерное изображение)? В этом случае вы можете просто привязать непосредственно к этому значению.

{Binding PrpSelectedTable.Value, Mode=TwoWay} 

Это обновит значение в выбранной таблице. Я также предложил бы сделать таблицу реализацией интерфейса INotifyPropertyChanged. Таким образом, если значение Value или Name в таблице изменится, дисплей автоматически обновится. Надеюсь, это поможет.

+0

Я хочу изменить выбранное значение таблицы в коллекции. Например, значение t25 изменено на 0, после чего я изменил значение t22 на 10. Затем, когда t25 выбран, 0 должно появиться в текстовом поле. Но в этом случае он этого не делает. – drW

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