0

В моем приложении WP8 у меня есть класс, который имеет свойство ObservableCollection<ObservableCollection<int>> под названием Matrix.Xaml двусторонняя привязка текстового поля к наблюдаемой коллекции

Я хочу отобразить эти матрицы с помощью элемента управления.

<ItemsControl ItemsSource="{Binding FirstMatrix.Matrix}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <ItemsControl ItemsSource="{Binding}"> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <StackPanel Orientation="Horizontal"></StackPanel> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <TextBox Text="{Binding}" /> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

Этот код работает в отношении отображения (он заполняется нулями, которое является значением по умолчанию). Но я также хочу разрешить изменения в TextBoxes, которые будут отражены в свойстве Matrix - теперь TextBoxes не могут быть изменены, потому что их значение связано одним способом с ячейками Matrix, я думаю. Я попытался установить <TextBox Text="{Binding Mode=TwoWay}" /> или аналогично, но он, похоже, не работает. Любые идеи о том, как должны привязываться данные?

EDIT: Я внедрил INotifyPropertyChanged. Вот часть моего класса:

public partial class CalcMatrix : INotifyPropertyChanged 
    { 
     public ObservableCollection<ObservableCollection<int>> Matrix 
     { 
      get { return _matrix; } 
      set 
      { 
       _matrix = value; 
       OnPropertyChanged("Matrix"); 
      } 
     } 
     private ObservableCollection<ObservableCollection<int>> _matrix; 

     private void OnPropertyChanged(string argName) 
     { 
      var handler = PropertyChanged; 
      if(handler != null) 
       handler(this, new PropertyChangedEventArgs(argName)); 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
    } 

Я думаю, что причина, по которой TexBoxes не меняется, потому что связывание является одним из способов - Текст всегда то, что находится внутри Матрицы. Я считаю, что я должен каким-то образом изменить привязку XAML к TwoWay или что-то еще, но не знаю, как это сделать. Есть идеи ?

+0

«общественное ObservableCollection > матрица» .. его свойство, но это не примитивный тип данных, как строка или целое число сво коллекцию. –

ответ

0

Двухсторонний режим связывания требуют пути (почему? see this SO answer), поэтому вы не можете сделать это точно так же, как {Binding Mode=TwoWay}, это должно быть что-то вроде {Binding SomePath, Mode=TwoWay}. Следовательно, в этом случае вам нужно обернуть элемент матрицы как некоторый класс вместо простого int и поместить значение int как свойство этого класса.

//your Matrix property type become: 
... 
public ObservableCollection<ObservableCollection<MatrixElement>> Matrix 
... 

//MatrixElement class is something like: 
public class MatrixElement : INotifyPropertyChanged 
{ 
    private int _value; 
    public int Value 
    { 
     get { return _value; } 
     set { 
       _value = value; 
       OnPropertyChanged("Value"); 
      } 
    } 

    .... 
} 

//then you can bind TextBox in two way mode 
... 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding Value, Mode=TwoWay}" /> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
... 
1

Причина, по которой она не работает, заключается в том, что источник items - это список Матрицы, и вы не вносите никаких изменений в список, который, как добавление или удаление из списка, вместо этого вы изменяете свойство элемента, присутствующего в списке, я предполагаю вы используете ObservableCollection .... Так что вам нужно реализовать интерфейс INotifyPropertyChanged сказать, что интерфейс Эй я изменился, пожалуйста, обновите себя ....

class YourClass : INotifyPropertyChanged 
{ 

private string yourProperty; 
public string YourPropety{ 
    get{ 
     return yourProperty; 
    } 
    set{ 
     if (value != this.yourProperty) 
      { 
       this.yourProperty = value; 
       NotifyPropertyChanged(); 
      } 
    } 
}  

public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx –

+0

Я внедрил INotifyPropertyChanged. Посмотрите на мой отредактированный пост. – wzielin3

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