【问题标题】:Binding Datagrid Item to Textboxes将 Datagrid 项绑定到文本框
【发布时间】:2014-07-03 08:36:53
【问题描述】:

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

如果您需要更多信息,请随时询问。

在我看来,我尝试将 Datagrid 的选定项的数据绑定到文本框。 在文本框中,可以有您要添加的新员工或您要编辑的 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 中,我将所选员工的值设置为文本框中显示的员工,并为两者引发事件。

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

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

【问题讨论】:

  • 所以SelectedEmployee setter 会在您更改DataGrid 中的选定项目时触发?
  • 改善您的问题并让人们阅读它的好方法(它实际上可能会帮助您自己解决问题)是尽可能多地删除代码,直到删除更多代码不会重现问题并且只有这样,发布它。
  • @Boot750 还要确保在绑定SelectedEmployee 时设置了哪个值,这会更新Employee 属性,并触发SelectionChanged 命令,该命令也执行Employee = _selectedEmployee;
  • @dkozl 1. 是的,如果我更改选择,则会触发 SelecteEmplyee 触发器。 2. 两个部分都设置了相同的值,所以我可以删除其中一个。现在我在 SelectionChange 方法中删除了。价值观在课堂上是正确的。但它不会更新文本框。感谢您的快速回复。
  • @franssu 对不起,下次我会做得更好

标签: c# wpf mvvm binding


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的快速回复。使用此代码,我可以在我的文本框中显示 Selected 值。我希望用户能够在此屏幕上添加新员工或更新列表中的员工。为此,我创建了 SelectedEmployee 属性,如果用户想要添加新员工,则将其设置为 null
  • SelectedEmployee 与添加新的Employee 无关...要做到这一点,您只需要调用Employees.Add(new Employee())
  • 用户可以将数据输入到此文本框中,并将新员工添加到数据网格中。或者他选择一个并更改现有的数据。
【解决方案2】:

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

https://mvvmlight.codeplex.com/

我只需要使用 RaisePropertyChanged 更改 NotifyPropertyChanged。

还要感谢@Sheridan 的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多