XAML双向文本框的结合观察到的集合(Xaml two way binding of textbox

2019-10-30 04:36发布

在我的WP8应用程序我有一个类,它有一个ObservableCollection<ObservableCollection<int>>属性称为矩阵。

我想用项目控件来显示这些矩阵。

 <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>

代码工作就显示而言(它是用零填充这是一个默认值)。 但我也希望允许文本框的变化这将在矩阵属性得到体现 - 现在的文本框不能被改变,因为它们的价值势必一种方式矩阵I猜细胞。 我尝试设置<TextBox Text="{Binding Mode=TwoWay}" />或某物类似,但它似乎不工作。 任何想法应该如何将数据绑定?

编辑:我已经实现了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结合双向或东西,但不知道怎么办。 有任何想法吗 ?

Answer 1:

双向结合模式需要路径(为什么呢? 看到这个苏答案 ),所以你不能做到这一点,就像{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>
...


Answer 2:

它没有工作的原因是的ItemSource是矩阵的列表,你是不是做对列表中的任何改变iteself如添加或从列表中删除,而不是你在列表改变本项目的属性我假设你使用的是的ObservableCollection ....所以,你需要实现INotifyPropertyChanged接口告诉嘿,我改变了请及时更新自己的UI ....

 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));
        } 
    }
 }


文章来源: Xaml two way binding of textbox to observable collection