当项目源的属性发生变化时,XAML Gridview不会更新

时间:2017-08-10 03:49:22

标签: c# xaml gridview data-binding

更新:

这似乎是两个独立的绑定,一个在内存中的对象和GridView之间,另一个在内存中的对象和文本框之间。

文本框将更改传播回内存中的对象,但这些更改无法反映在GridView的显示中。

ORIGINAL:

我一直在做一些研究并尝试了一些不同的技术,但我无法让我的gridview进行更新。目标是让GridView显示项目切片列表,数据绑定到ObservableCollection。在同一页面上的GridView下面,是一个用于编辑GridView中项目的表单。当用户在GridView中选择一个项目时,表单的文本框(和其他控件)会自动填充GridView中所选项目的属性值。修改控件的值然后更改所选GridView项的属性值。

我有一个Conference数据类型,它包含一个Name属性(类型为string)。 “会议”的类型为ObservableCollection。

gridview看起来像这样(为简洁起见,这里删除了一些属性):

<GridView Style="{StaticResource HorizontalScrollGridView}"
                  Name="ConferencesGridView"
                  ItemsSource="{Binding Conferences, Mode=TwoWay}"
                  SelectionChanged="ConferencesGridView_SelectionChanged">

GridView内部是一个项目模板,如下所示:

<GridView.ItemTemplate>
                <DataTemplate x:DataType="data:Conference">
                    <Grid Height="150"
                          Width="150">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                        </Grid.RowDefinitions>

                        <TextBlock Grid.Row="0"></TextBlock>
                        <TextBlock Grid.Row="1"
                                   Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                                   TextWrapping="WrapWholeWords"></TextBlock>
                    </Grid>
                </DataTemplate>
            </GridView.ItemTemplate>

请注意,XML名称空间“data:”已正确定义,以引用名称为“Conference”数据类型的名称空间。在程序运行时,没有编译错误,只有意外(或在这种情况下完全丢失)行为。

最后,在同一页面上,但不在GridView中,是用于编辑当前所选项目的表单。它包括如下文本框:

<TextBox Name="ConferenceNameTextBox"
                 Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"
                 TextChanged="ConferenceNameTextBox_TextChanged"></TextBox>

文本框的DataContext是以编程方式设置的,位于GridView的SelectionChanged事件处理程序中:

ConferenceNameTextBox.DataContext = (Conference)ConferencesGridView.SelectedItem;

现在,在Textbox的TextChanged事件处理程序中,以下代码行修改GridView中所选项的属性(我知道使用TextChanged而不是LostFocus会影响性能,但我将解决在我得到基本概念之后):

((Conference)ConferencesGridView.SelectedItem).Name = ConferenceNameTextBox.Text;

因此,在运行时,我在GridView中选择不同的项目。没问题;文本框的值相应更新,显示当前所选GridView项的名称值。

我更改了文本框中的文本,该文本成功更新了GridView用作源的项目。我通过在GridView中选择不同的项目,然后返回选择已编辑的项目,以及导航到框架内的不同XAML页面,然后返回到编辑的页面来验证这一点。编辑后的值将被保留。

但是,在更新文本框的文本值时,GridView的项模板中显示的文本不会更新。 GridView仅在重新加载XAML页面时更新(导航然后在其包含的帧中返回到它)。

通过我的研究我发现ObservableCollection足以在源代码中添加和删除项目(实际上这样做会在GridView上更新),但这不足以改变源代码中列表项的属性

我看到在源对象(在这种情况下是会议对象)上实现INotifyPropertyChanged是必要的。我已经这样做了。我还读过有关需要将文本框双向绑定到数据源的内容。我也试过了,没有成功:

public class Conference : INotifyPropertyChanged
{
    public string Name { get; set; }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        // Raise the PropertyChanged event, passing the name of the property whose value has changed.
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

在ASP.NET中,我记得在编辑数据源中的数据后调用GridView.DataBind(),这将刷新GridView。但是在XAML中似乎没有相应的东西。

我猜测缺少某些东西,或者我没有合适的组件组合。总结如下:

如何在文本框(位于GridView外部,用于编辑GridView中所选项目的Name属性)时更新GridView的显示项目(包括显示项目的Name属性)以进行更新变化?

1 个答案:

答案 0 :(得分:0)

您可以使用ObservableCollection 例如-

ObservableCollection<ClassName> DataList = new ObservableCollection<ClassName>(); //Declaration
gridName.ItemsSource=DataList;

它对我有用... 谢谢