将Datagrid项绑定到文本框

时间:2014-07-03 08:36:53

标签: c# wpf mvvm binding

我尝试将数据网格中的选定项绑定到某些文本框。 遗憾的是,文本框不会在更改时更新。

如果您需要更多信息可以随意询问。

在我看来,我尝试将Datagrid的所选Item的数据绑定到Textboxes。 在文本框中,可以添加要添加的新员工或要编辑的其中一个Datagrid。

    <TextBox Name="TxtName" Text="{Binding Employee.LastName}" Grid.Column="1" Grid.Row="0"></TextBox>
    <TextBox Name="TxtFirstName" Text="{Binding Employee.FirstName}"  Grid.Column="3" Grid.Row="0"></TextBox>
    <TextBox Name="TxtDateOfBirth" Text="{Binding Employee.DateOfBirth, StringFormat=d}" Grid.Column="1" Grid.Row="1"></TextBox>
    <ComboBox Name="CmbGender" SelectedItem="{Binding Employee.Gender}" ItemsSource="{Binding Genders}" DisplayMemberPath="Short" Grid.Column="3" Grid.Row="1"/>


    <DataGrid Name="GrdAllEmployees" ItemsSource="{Binding Employees}" SelectedItem="{Binding SelectedEmployee}" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="4" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding SelectionChanged}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>

在我的ViewModel中,我将Selected Employee的值设置为Textboxes中显示的Employee,并为两者提升事件。

        public Employee SelectedEmployee
        {
            get { return _selectedEmployee; }
            set
            {
                _selectedEmployee = value;
                NotifyPropertyChanged("SelectedEmployee");
                _employee = _selectedEmployee;
                NotifyPropertyChanged("Employee");
            }
        }

在此之后,调试时的值是正确的。但视图不会更新。

2 个答案:

答案 0 :(得分:1)

有一种更简单的方法可以显示DataGrid中所选项目的值,或者实际上是WPF中的任何集合控件。那就是使用Selector.IsSynchronizedWithCurrentItem property。如果将此项设置为true,则可以使用/表示法从该集合中引用所选项目,这意味着当前项目。尝试这样的事情:

<StackPanel>
    <DataGrid ItemsSource="{Binding Employees}" IsSynchronizedWithCurrentItem="True" />
    <TextBlock Text="{Binding Employees/Name}" />
</StackPanel>

这将显示Name中当前所选项目的DataGrid属性值。更多信息......来自MSDN上的Binding.Path Property页:

  

当源是集合视图时,可以使用斜杠(/)指定当前项。例如,子句Path = /设置绑定到视图中的当前项。当源是集合时,此语法指定默认集合视图的当前项。

     

可以组合属性名称和斜杠来遍历作为集合的属性。例如,Path = / Offices / ManagerName指定源集合的当前项,其中包含也是集合的Offices属性。它的当前项是包含ManagerName属性的对象。

答案 1 :(得分:0)

在我用我从nuget下载的MVVMlight替换了我自己的RelayCommand和ViewModelBase类后,它对我有用。

https://mvvmlight.codeplex.com/

我只需要使用RaisePropertyChanged更改NotifyPropertyChanged。

但也感谢@Sheridan的建议。