C# Databinding ListView не работает — Windows 10 универсальный

У меня есть база данных, откуда я беру свой «Baustellen». Теперь я хочу показать их «strasse» на ListView через привязку данных, но они не появляются. Ты хоть представляешь почему?

Baustelle.цезий:

namespace SchlachterFliesen.Code
{
   public class Baustelle
   {
    public int id;
    public Kunde bauherr;
    public Kunde auftraggeber;
    public Ort ort;
    public string strasse, hausnr, bauauftrag, status;

    public Baustelle()
    {

    }

    public Baustelle(int id, Kunde bauherr, Kunde auftraggeber, Ort ort, string strasse, string hausnr, string bauauftrag, string status)
    {
        this.id = id;
        this.bauherr = bauherr;
        this.auftraggeber = auftraggeber;
        this.ort = ort;
        this.strasse = strasse;
        this.hausnr = hausnr;
        this.bauauftrag = bauauftrag;
        this.status = status;
    }

    public override string ToString()
    {
        return
            "Baustelle@" + GetHashCode() + "rn" +
            "ID: " + id + "rn" +
            "Bauherr: " + bauherr?.name + "rn" +
            "Auftraggeber: " + auftraggeber?.name + "rn" +
            "Ort: " + ort?.name + "rn" +
            "Straße: " + strasse + "rn" +
            "Hausnummer: " + hausnr + "rn" +
            "Bauauftrag: " + bauauftrag + "rn" +
            "Status: " + status;                 
    }
  }
}

Baustelle.код XAML.цезий

namespace SchlachterFliesen
{
/// <summary>
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann.
/// </summary>
public sealed partial class Baustelle : Page
{
    private List<Code.Baustelle> Baustellen;
    public Code.Baustelle[] baustellen;

    public Baustelle()
    {
        this.InitializeComponent();

        Daten.LadeAlleBaustellen(new Daten.Ziel<Code.Baustelle[]>(empfaenger));  //HERE I GRAB THEM!


    }

    public void empfaenger(Code.Baustelle[] baustellen)
    {
        this.baustellen = baustellen;
        Baustellen = GetBaustellen();
    }

    public List<Code.Baustelle> GetBaustellen()
    {
        var baustellenListe = new List<Code.Baustelle>();

        if (baustellen.Length > 0)
        {
            for (int i = 0; i < baustellen.Length; i++)
            {
                baustellenListe.Add(new Code.Baustelle(baustellen[i].id, baustellen[i].bauherr, baustellen[i].auftraggeber, baustellen[i].ort, baustellen[i].strasse, baustellen[i].hausnr, baustellen[i].bauauftrag, baustellen[i].status));
            }
        }
        //myTextBlock.Text = res;
        return baustellenListe;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        var currentView = SystemNavigationManager.GetForCurrentView();
        currentView.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
        currentView.BackRequested += backButton_Tapped;
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        var currentView = SystemNavigationManager.GetForCurrentView();
        currentView.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Collapsed;
        currentView.BackRequested -= backButton_Tapped;
    }

    private void backButton_Tapped(object sender, BackRequestedEventArgs e)
    {
        var rootFrame = Window.Current.Content as Frame;
        var mainPage = rootFrame.Content as MainPage;


        if (rootFrame != null && rootFrame.CanGoBack)
        {
            e.Handled = true;
            rootFrame.Navigate(typeof(MainPage));
            rootFrame.GoBack();
        }
    }
  }
}

Baustelle.код XAML

<Page
x_Class="SchlachterFliesen.Baustelle"






mc_Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Frame Name="baustelleFrame">
        <Grid>
            <ListView Name="baustellenListView" ItemsSource="{x:Bind Baustellen}" HorizontalAlignment="Center">
                <ListView.ItemTemplate>
                    <DataTemplate x_DataType="data:Baustelle">
                        <StackPanel>
                            <TextBlock FontSize="10" Text="{x:Bind strasse}"/>

                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

        </Grid>
    </Frame>        
  </Grid>
</Page>

3 ответа

  1. Значения «strasse, hausnr, bauauftrag, status» должны быть свойствами, например public Strasse { get; set;}, а затем привязываться к тем, которые должны работать — вам может потребоваться установить источник данных списка, чтобы быть списком элементов.

  2. Я вставил ваш код в новое приложение, сделав минимальные настройки, чтобы он компилировался вне вашей среды. Привязки работают просто отлично:

    Введите описание изображения здесь

    У меня нет доступа к коду, который вы используете для загрузки данных, поэтому я немного изменил код, например (переименовав страницу, чтобы у нее не было такого же имени, как у вашего класса модели):

    public BaustellePage()
    {
        this.InitializeComponent();
    
        Empfänger(
            new Baustelle(1, "herr 1", "auf 1", "ort 1", "strasse 1", "42", "50", "good"),
            new Baustelle(2, "herr 2", "auf 2", "ort 2", "strasse 2", "42", "50", "good"),
            new Baustelle(3, "herr 3", "auf 3", "ort 3", "strasse 3", "42", "50", "good"));
    
    }
    
    public void Empfänger(params Baustelle[] baustellen)
    {
        this.baustellen = baustellen;
        Baustellen = GetBaustellen();
    }
    

    (Я также заменил Kundeи OrtСstring, для простоты.

    В вашем собственном коде, если вы установили точку останова в начале Empfänger(обратите внимание, что’ ä ‘ допустимо). Вы видите какие-либо данные?

    Если да, то привязки должны работать. Если нет,вы нашли свою проблему.

    Несвязанный, но: вы можете значительно упростить свой код. Вот один пример того, как:

    private List<Baustelle> Baustellen;
    
    public BaustellePage()
    {
        InitializeComponent();
    
        Empfänger(
            new Baustelle(1, "herr 1", "auf 1", "ort 1", "strasse 1", "42", "50", "good"),
            new Baustelle(2, "herr 2", "auf 2", "ort 2", "strasse 2", "42", "50", "good"),
            new Baustelle(3, "herr 3", "auf 3", "ort 3", "strasse 3", "42", "50", "good"));
    
    }
    
    private void Empfänger(params Baustelle[] baustellen)
    {
        var baustellenListe = new List<Baustelle>();
        baustellenListe.AddRange(baustellen);
        Baustellen = baustellenListe;
    }
    

    (GetBaustellenушел ,как тот (публика?) baustellenполе.