Как отобразить значение данных внешнего ключа из базы данных в TextBlock при обновлении формы в WPF (MVVM / Entity Framework)? - PullRequest
0 голосов
/ 02 сентября 2018

OpcUaEndpoint с данными

Режим, описание отображается в текстовом блоке, но значение внешнего ключа OpcUaEndpoint не отображается.

Что мне здесь не хватает? Пожалуйста, помогите.

Xaml разметка:

<ItemsControl Name="icName" Margin="10,10,10,10" ItemsSource="{Binding Scans}" Grid.IsSharedSizeScope="True" Grid.ColumnSpan="6" MouseDown="icName_MouseDown">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Border x:Name="Border" Padding="8" BorderThickness="0 0 0 1" BorderBrush="{DynamicResource MaterialDesignDivider}">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition SharedSizeGroup="Checkerz" />
                                    <ColumnDefinition />
                                </Grid.ColumnDefinitions>
                                <ToggleButton VerticalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource MaterialDesignActionLightToggleButton}" Content="{Binding Code}" Grid.Column="0" />
                                <StackPanel Margin="30 0 0 0" Grid.Column="1">
                                    <TextBlock FontWeight="Bold" Text="{Binding Name}" />
                                    <TextBlock>
                                       <Run Text="Mode: " />
                                          <Run Text="{Binding Mode}" />
                                          <Run Text=", " />
                                        <Run Text="{Binding Description}" />
                                          <Run Text="{Binding Scan.OpcUaEndpointRefID}" />
                                    </TextBlock>
                                </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl> 
Code behind:

        public ControlCenterView()
        {
                    InitializeComponent();
                    var viewmodel = new ScanListViewModel();
                    ScanList.DataContext = viewmodel;
        }

         Modelview

        public DB.model.OpcUaEndpoint OpcUaEndpoint
        {
                    get { return _opcUaEndpoint; }
                    set
                    {
                        _opcUaEndpoint = value;
                        OnPropertyChanged("OpcUaEndpoint");
                    }
        }

        public IEnumerable<DB.model.OpcUaEndpoint> OpcUaEndpointsValues
        {
            get { return GetOpcUaEndpoints(); }
        }

        public IEnumerable<DB.model.Scan> ScanValues
        {
            get { return GetScans(); }
        }

        private IList<DB.model.OpcUaEndpoint> GetOpcUaEndpoints()
        {
            _opcUaEndpointsNames = new List<DB.model.OpcUaEndpoint>();

            foreach (var opcpointname in opcUaEndpointsService.GetAll())
            {
                        _opcUaEndpointsNames.Add(opcpointname);
            }

            return _opcUaEndpointsNames;
        }



         //OpcUaEndpoint Model 
             public class OpcUaEndpoint : PlantObject
                {
                    /// <summary>
                    ///     Get or Sets the Identifier.
                    /// </summary>
                    [Key]
                    public int OpcUaEndpointId { get; set; }

                    /// <summary>
                    ///     name of the OpcUaEndpoints.
                    /// </summary>
                    [MaxLength(80)]
                    public string Name { get; set; }

                    /// <summary>
                    ///     OpcUaEndpoint.
                    /// </summary>
                    [MaxLength(255)]
                    public string Endpoint { get; set; }

                    /// <summary>
                    ///     description of the OpcUaEndpoints
                    /// </summary>
                    [MaxLength(255)]
                    public string Description { get; set; }

                    /// <summary>
                    ///UserName of the OpcUaEndpoints
                    /// </summary>
                    [MaxLength(80)]
                    public string Username { get; set; }

                    /// <summary>
                    ///     Password of the OpcUaEndpoints
                    /// </summary>
                    [MaxLength(512)]
                    public string Password { get; set; }

                    /// <summary>
                    ///    RequestTimeout of the OpcUaEndpoints
                    /// </summary>
                    public int RequestTimeout { get; set; }

                    public ICollection<Scan> Scans { get; set; }

                    [NotMapped]
                    public bool IsSelected { get; set; }

                    [NotMapped]
                    public string SearchData { get; set; }

                    public override string ToString()
                    {
                        return Name;
                    }
                }

    //Scan Model 
    //its OpcUaEndpointId key to foreign key OpcUaEndpointRefId  in Scan Model.
    //And Scan Is Binded to Item control in Xaml.
     public class Scan : PlantObject
        {

            [Key]
            public int Id { get; set; }


            public int ScanId { get; set; }

            /// <summary>
            ///     name of the scan Mode.
            /// </summary>
            [MaxLength(80)]
            public string Name { get; set; }     


            [MaxLength(255)]
            public string Description { get; set; }



                  public string Code { get; set; }

            **/// <summary>
            ///    Id of the OPC-UA Endpoint for the Scan
            /// </summary>
            [ForeignKey("OpcUaEndpoint")]
            public int OpcUaEndpointRefId { get; set; }**
            /// <summary>
            /// Foreign key to OpcUaEndPoint
            ///
            /// </summary>
            public OpcUaEndpoint OpcUaEndpoint { get; set; }

                   [MaxLength(255)]
            public string DrivingTag { get; set; }

                   [MaxLength(80)]
            public string Operator { get; set; }

            [MaxLength(80)]
            public string Value { get; set; }
            [MaxLength(80)]
            public string DataMode { get; set; }
            [NotMapped]
            public bool IsSelected { get; set; }

            public bool IsEnable { get; set; }

            public DateTime? StartedOn { get; set; }

            public DateTime? StoppedOn { get; set; }


            [MaxLength(80)]
            public string Status { get; set; }
        }

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Перво-наперво, я не вижу, где вы устанавливаете ваше OpcUaEndpoint публичное свойство, если вы устанавливаете ваше личное поле, то OnPropertyChanged("OpcUaEndpoint"); не будет достигнуто и не будет успешно обновлено. Мы не можем видеть, что вы связываете с этим StackPanel, в вашем XAML отсутствует лучшая часть, обновите его до полного Grid (вы можете удалить личные вещи, если хотите).

Покажите нам, где вы установили OpcUaEndpoint и убедитесь, что вы не устанавливаете _opcUaEndpoint.

С другой стороны ... вы устанавливаете целую сущность в свойство Run Text, которое вызовет "проблемы", вы должны связать ее следующим образом <Run Text="{Binding OpcUaEndpoint.OpcUaEndpointId }" />

0 голосов
/ 03 сентября 2018

Непонятно, хотите ли вы ссылаться на свойство в OpcUaEndpoint или на свойство в модели представления. Я думаю, что проблема в том, что привязка непосредственно к экземпляру OpcUaEndpoint не может преобразовать в строку.

Попробуйте это:

<Run Text="{Binding OpcUaEndpointRefId}" />

Или это:

<Run Text="{Binding OpcUaEndpoint.OpcUaEndpointID}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...