[英]XAML: Property on DependecyObject not updating when it is an item in an attached collection
[英]XAML Gridview is not updating when property of item scource changes
更新:
這似乎是兩個單獨的綁定,一個在內存中的對象和GridView之間,一個在內存中的對象與文本框之間。
文本框將更改傳播回內存中的對象,但是這些更改無法反映在GridView的顯示中。
原版的:
我一直在做一些研究,嘗試了幾種不同的技術,但是我無法更新自己的gridview。 目標是讓GridView顯示項目圖塊的列表,這些圖塊的數據綁定到ObservableCollection。 在同一頁面上的GridView下方是用於編輯GridView中的項目的表單。 當用戶在GridView中選擇一個項目時,表單的文本框(和其他控件)將自動使用GridView中所選項目的屬性值進行填充。 修改控件的值,然后更改所選GridView項的屬性值。
我有一個會議數據類型,其中包括一個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:”以引用定義“會議”數據類型的名稱空間。程序運行時沒有編譯錯誤,只有意外(或在這種情況下完全丟失)行為。
最后,在同一頁面上(但不在GridView中)是用於編輯當前所選項目的表單。 它包括以下文本框:
<TextBox Name="ConferenceNameTextBox"
Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"
TextChanged="ConferenceNameTextBox_TextChanged"></TextBox>
在GridView的SelectionChanged事件處理程序中,以編程方式設置文本框的DataContext:
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屬性)?
您可以使用ObservableCollection
例如-
ObservableCollection<ClassName> DataList = new ObservableCollection<ClassName>(); //Declaration
gridName.ItemsSource=DataList;
對我有用...謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.