Текстовое поле с привязкой к ядру WPF не отображается во время выполнения

Изучение шаблона WPF Core 3.0 WPF MVVM с использованием Visual Studio 2019 4.8.04084.

У меня есть MainWindow со следующим (за исключением шаблона)

      <Window>
    
    <Grid
        Width="1024"
        Height="768"
        Margin="0,0,0,0">

        <Grid.RowDefinitions>
            <RowDefinition Height="100" />
        </Grid.RowDefinitions>

        <usercontrols:CustomerMaintenanceControl
            x:Name="CustomerMaintenance"
            Grid.Row="0"
            Height="109"
            VerticalAlignment="Top" />

    </Grid>
    
</Window> 

Пользовательский элемент управления CustomerMain maintenanceControl выглядит так:

      <UserControl
    x:Class="Redacted.UserControls.CustomerMaintenanceControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:usercontrols="clr-namespace:Redacted.UserControls"
    xmlns:vm="clr-namespace:Redacted.ViewModels"
    d:DesignHeight="450"
    d:DesignWidth="800"
    Loaded="UserControl_Loaded"
    mc:Ignorable="d">
    <UserControl.Resources>
        <vm:CustomerMaintenanceViewModel x:Key="viewModel" />
    </UserControl.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <usercontrols:CustomerMaintenanceGridControl
            x:Name="gridControl"
            Grid.Row="0"
            Height="200"
            DataContext="{StaticResource viewModel}" />

        <usercontrols:CustomerMaintenanceDetailControl
            x:Name="detailControl"
            Grid.Row="1"
            Width="800"
            Height="200"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            DataContext="{StaticResource viewModel}" />

    </Grid>
</UserControl>

Вот CustomerMain maintenanceDetailControl, где проблема:

      <UserControl
    x:Class="Redacted.UserControls.CustomerMaintenanceDetailControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:Redacted"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    d:DesignHeight="450"
    d:DesignWidth="800"
    mc:Ignorable="d">
    <Grid Margin="0,0,0,325">
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <TabControl
            x:Name="tabControl"
            Grid.Row="0"
            Margin="0,0,0,0">
            <TabItem>
                <TabItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock>General</TextBlock>
                    </StackPanel>
                </TabItem.Header>
                <StackPanel>
                    <TextBox
                        x:Name="companynmTextbox"
                        Width="322"
                        Margin="0,32,228,0"
                        HorizontalAlignment="Left"
                        IsReadOnly="True"
                        Text="{Binding Path=Entity.Companynm}" />
                </StackPanel>
            </TabItem>
        </TabControl>
    </Grid>
</UserControl>

Таким образом, в CustomerMainastedControl есть два пользовательских элемента управления: CustomerMainastedGridControl с DataGrid, а затем CustomerMain maintenanceDetailControl с вкладкой и связанным TextBox. Сетка хорошо извлекает данные, поэтому модель и уровень данных работают. Однако элемент управления companyNmTextBox в CustomerMainastedGridControl ничего не отображает.

В VS нет ошибок привязки. Кроме того, когда я запускаю приложение и открываю Live Visual Tree, я могу открыть свойства для 'companyNmTextBox', а в Inherited \ DataContext у меня есть моя ObservableCollection 'Customers' и заполнено, а мое свойство 'Entity' в модели заполнено с данными первого клиента. Пока ничего не отображается на экране.

Я уверен, что это что-то идиотское, но есть идеи?

2 ответа

Ваша организация должна реализовать INotifyPropertyChanged интерфейс

      public class Entity : INotifyPropertyChanged  
{  
    private string companynm;
    public string Companynm
    {  
        get  
        {  
            return companynm;  
        }  

        set  
        {   
            this.companynm = value;  
            NotifyPropertyChanged();  
        }  
    }
    ...
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")  
    {  
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }  
}

Также TextBox companynmTextbox имеет свойство IsReadOnly установлено значение true, поэтому в этом случае я бы изменил привязку.

      Text="{Binding Path=Entity.Companynm, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"

Это была опечатка при вызове RaiseProprtyChanged () в ViewModel, который использует CustomerMainastedDetailControl.

Я имел:

        private Customer _entity = new Customer();

    public Customer Entity
    {
        get { return _entity; }
        set
        {
            _entity = value;
            RaisePropertyChanged("Customer");  // <- problem here
        }
    }

Я должен был иметь:

         private Customer _entity = new Customer();

    public Customer Entity
    {
        get { return _entity; }
        set
        {
            _entity = value;
            RaisePropertyChanged("Entity");  // <- doh
        }
    }
Другие вопросы по тегам