更新:
这似乎是两个独立的绑定,一个在内存中的对象和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属性)以进行更新变化?
答案 0 :(得分:0)
您可以使用ObservableCollection
例如-
ObservableCollection<ClassName> DataList = new ObservableCollection<ClassName>(); //Declaration
gridName.ItemsSource=DataList;
它对我有用... 谢谢