В случае использования пользовательского элемента управления в качестве шаблона данных элемента, например, в виде представления сетки, кажется, что конструктор пользовательского элемента управления вызывается дважды в первый раз, когда генерируется первый элемент представления сетки (и только когда первый элемент создается), это нормально? И может кто-нибудь сказать, пожалуйста, почему? Во-вторых, в процессе конструирования каждого элемента в виде сетки событие 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);
}