簡體   English   中英

當項目搜索的屬性更改時,XAML Gridview不會更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM