更新绑定到DataGrid的TextBox

时间:2016-12-07 12:50:49

标签: binding datagrid textbox propertychanged

我希望我能正确解释我的问题。 我有一个绑定到ObservableCollection对象的数据网格,以及绑定到我的数据网格的选定项目的TextBox。 当我以编程方式修改SelectedItem属性值(Name)时,我的TextBox文本值不会更新! 这是我的设计代码:

    <DataGrid Name="grid" HorizontalAlignment="Left" Margin="119,28,0,0" VerticalAlignment="Top" Height="237" Width="200" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn  Header="nom" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataGrid.Columns>
    </DataGrid>

    <TextBox Name="textbox" Text="{Binding ElementName=grid, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="18" Margin="119,276,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/>
    <Button Content="Button" HorizontalAlignment="Left" Margin="392,54,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>

这是我的代码背后:

    ObservableCollection<Element> obs;

    class Element
    {
        public string Name { get; set; }
        public Element(string name) { Name = name; }
    }

    public MainWindow()
    {
        InitializeComponent();

        obs = new ObservableCollection<Element>() { new Element("element2"), new Element("element2"), new Element("element3")};
        grid.ItemsSource = obs;

    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var sel = grid.SelectedItem as Element;
        sel.Name = "something";
        grid.Items.Refresh(); //this updates the selected element to "something" but does nothing to the textbox
    }

1 个答案:

答案 0 :(得分:0)

问题解决了。

每当对模型进行修改时,我都必须触发PropertyChanged事件。 这里是我的新代码:

    class Element : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        string name;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
            }
        }
        public Element(string name) { Name = name; }
    }