UserControl не показывает данные - PullRequest
0 голосов
/ 01 мая 2019

Я не вижу ОК, ну, я вижу его, но он чистый, он не нулевой, потому что он показывает пустые объекты ОК (правильное количество записей в БД) Но это происходит только при использовании причины uc, если я использую простую привязку данных без uc, я могу видеть все записи. Я уже сделал точку останова, чтобы увидеть, если по какой-то причине данные, переданные со свойством зависимости, были нулевыми, но в объекте есть вся информация, просто он не может передать данные в uc xaml.

Alredy пробовал без uc и все работает

UC XAML

<Grid>
        <StackPanel>
            <Button x:Name="elementoButton">
                <Image x:Name="elementoImage" Width="64" Height="64"/>
            </Button>
            <TextBlock x:Name="ipTextBlock" HorizontalAlignment="Center"/>
            <TextBlock x:Name="nomeTextBlock" HorizontalAlignment="Center"/>
        </StackPanel>
    </Grid>

UC C #

public Classes.Elementi elementi
        {
            get { return (Classes.Elementi)GetValue(elementiProperty); }
            set { SetValue(elementiProperty, value); }
        }

        // Using a DependencyProperty as the backing store for elementi.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty elementiProperty =
            DependencyProperty.Register("elementi", typeof(Classes.Elementi), typeof(ElementoControl), new PropertyMetadata(new Classes.Elementi { IndirizzoIP = "0.0.0.0", Nome = "Undefined", Image = "/Control Panel 2.0;component/img/default.png" }, SetElemento));



        private static void SetElemento(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ElementoControl elementoControl = new ElementoControl();
            if (elementoControl != null)
            {
            elementoControl.ipTextBlock.Text = (e.NewValue as Classes.Elementi).IndirizzoIP;
            elementoControl.nomeTextBlock.Text = (e.NewValue as Classes.Elementi).Nome;

            #region SetImage
            if ((e.NewValue as Classes.Elementi).Categoria == "Uruk")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "Server")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "Router")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "Pannelli Solari")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "EasyCapture")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "Computer")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "Internet")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "Stampante")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            else if ((e.NewValue as Classes.Elementi).Categoria == "UPS")
            {
                elementoControl.elementoImage.Source = new BitmapImage(new Uri((e.NewValue as Classes.Elementi).Image, UriKind.Relative));
            }
            #endregion

            #region IsPingable
            if (IsPingable((e.NewValue as Classes.Elementi).IndirizzoIP))
            {
                elementoControl.elementoButton.Background = new SolidColorBrush(Colors.DarkGreen);
            }
            else
            {
                elementoControl.elementoButton.Background = new SolidColorBrush(Colors.DarkRed);
            }
            #endregion
            }
            else
               MessageBox.Show("usercontrol nullo");
        }

MainWindow XAML

<StackPanel>
                <ListView x:Name="elementiListView" Background="DodgerBlue">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <uc:ElementoControl elementi="{Binding}"/>
                            <!--<StackPanel>
                                <Button x:Name="elementoButton">
                                    <Image x:Name="imageButton" Source="{Binding Image}" Width="64" Height="64"></Image>
                                </Button>
                                <TextBlock Text="{Binding Nome}" HorizontalAlignment="Center"/>
                                <TextBlock Text="{Binding IndirizzoIP}" HorizontalAlignment="Center"/>
                            </StackPanel>-->
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>

MainWindow C #

private void ReadDatabase()
        {
            List<Classes.Elementi> elementi = new List<Classes.Elementi>();
            using (SQLiteConnection connection = new SQLiteConnection(App.ElementiDB()))
            {
                connection.CreateTable<Classes.Elementi>();
                elementi = connection.Table<Classes.Elementi>().ToList();
            }
            if (elementi != null)
            {
                    elementiListView.ItemsSource = elementi;
            }
        }

В MainWindow XAML вы можете видеть, что я пробовал без uc, и без него он работает отлично, но мне нужно использовать uc, я ожидаю, что либо используя uc, я вижу то же самое, что без него

1 Ответ

0 голосов
/ 01 мая 2019

Первое: DependencyObject d - это ссылка на ElementoControl, свойство elementi которого было только что установлено.Но вы игнорируете это.Вместо этого вы создаете новый, устанавливаете свойства и выбрасываете новый.Естественно, реальный элемент управления не показывает никаких признаков установки его свойств, потому что вы никогда не касались их.

private static void SetElemento(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ElementoControl elementoControl = new ElementoControl();

    //  Why are you checking to see if this is null? You just created it. 
    if (elementoControl != null)
    {

Сделайте это вместо:

private static void SetElemento(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    //  If anybody calls this method with a reference to something other than 
    //  ElementoControl, that's a bug and an exception should be thrown. 
    if (!(d is ElementoControl))
    {
        throw new ArgumentException("d must be ElementoControl");
    }

    ElementoControl elementoControl = d as ElementoControl;

    //  This should be done mostly in XAML as well, but I don't have time at the 
    //  moment. I would give ElementoControl a boolean readonly dependency property 
    //  called IsPingable. I would set that property here, and in the XAML I would 
    //  give the button a Style with a DataTrigger that set the Button's background 
    //  color according to the value of IsPingable. 
    #region IsPingable
    if (IsPingable((e.NewValue as Classes.Elementi).IndirizzoIP))
    {
        elementoControl.elementoButton.Background = new SolidColorBrush(Colors.DarkGreen);
    }
    else
    {
        elementoControl.elementoButton.Background = new SolidColorBrush(Colors.DarkRed);
    }
    #endregion
}

Второе: обратите внимание, что я опустил большую часть описанного выше метода.Это потому, что вы должны связывать свойства viewmodel в XAML.Также обратите внимание, что подавляющее большинство описанного выше метода представляло собой длинную, длинную серию ветвей if / else, каждая из которых делала одно и то же.Вам не нужно выбирать шестнадцать различных способов сделать то же самое в любом случае.Просто сделай это.

Но настоящий вывод здесь заключается в том, что ваш UserControl «наследует» свой DataContext от своего родителя, в данном случае DataTemplate.По этой причине все те привязки, которые работали в исходном DataTemplate, будут обязательно работать одинаково в UserControl (если вы не нарушите вещи, явно установив DataContext UserControl в нечто сумасшедшее, но из того, что я вижу в вашем вопросе, вы не сделалиэто (если вы не сделали)).UserControls предназначены для работы таким образом.

<Grid>
    <StackPanel>
        <Button x:Name="elementoButton">
            <Image Source="{Binding Image}" Width="64" Height="64"/>
        </Button>
        <TextBlock Text="{Binding IndirizzoIP}" HorizontalAlignment="Center"/>
        <TextBlock Text="{Binding Nome}" HorizontalAlignment="Center"/>
    </StackPanel>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...