Вопрос о конструкторе пользовательского элемента управления, который используется в качестве таблицы данных, дважды вызывается в приложении uwp - PullRequest
0 голосов
/ 19 января 2020

В случае использования пользовательского элемента управления в качестве шаблона данных элемента, например, в виде представления сетки, кажется, что конструктор пользовательского элемента управления вызывается дважды в первый раз, когда генерируется первый элемент представления сетки (и только когда первый элемент создается), это нормально? И может кто-нибудь сказать, пожалуйста, почему? Во-вторых, в процессе конструирования каждого элемента в виде сетки событие DataContextChanged также вызывается дважды, когда сначала создается этот элемент (здесь контекст данных равен нулю), а во-вторых, когда этот элемент заполняется связанными данными. Не понимаю, почему это так. (Может быть, потому что событие DataContextChanged также возникает при создании элемента вида сетки?) Ниже приведен тестовый код для этого.

<GridView ItemsSource="{x:Bind Names, Mode=OneWay}" Grid.Row="1">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="data:TestModel" >
                <local:TestUserControl01/>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

public sealed partial class TestUserControl01 : UserControl
{
    public Models.TestModel Data
    {
        get { return this.DataContext as Models.TestModel; }
    }
    public TestUserControl01()
    {
        this.InitializeComponent();

        this.DataContextChanged += Window_DataContextChanged;
        Debug.WriteLine("contructor");
    }

    public void Window_DataContextChanged(object sender, DataContextChangedEventArgs e)
    {
        Debug.WriteLine(sender.ToString());
        Bindings.Update();
    }
}
public class TestModel
{
    public string Name { get; set; }
}

И функция события click для добавления элемента в вид сетки.

private void InputButton_Click(object sender, RoutedEventArgs e)
    {
        Names.Add(new TestModel
        {
            Name = NameInputBox.Text
        });

        NameInputBox.Text = "";

        NameInputBox.Focus(FocusState.Programmatic);
    }
...