【问题标题】:C# Databinding ListView not working - Windows 10 UniversalC# 数据绑定 ListView 不起作用 - Windows 10 通用
【发布时间】:2016-09-23 01:40:11
【问题描述】:

我有一个数据库,我可以从中获取我的“Baustellen”。现在我想通过 DataBinding 在 ListView 上显示他们的“strasse”,但他们没有显示出来。你知道为什么吗?

Baustelle.cs:

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() + "\r\n" +
            "ID: " + id + "\r\n" +
            "Bauherr: " + bauherr?.name + "\r\n" +
            "Auftraggeber: " + auftraggeber?.name + "\r\n" +
            "Ort: " + ort?.name + "\r\n" +
            "Straße: " + strasse + "\r\n" +
            "Hausnummer: " + hausnr + "\r\n" +
            "Bauauftrag: " + bauauftrag + "\r\n" +
            "Status: " + status;                 
    }
  }
}

Baustelle.xaml.cs

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"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:SchlachterFliesen"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data ="using:SchlachterFliesen.Code"
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>

【问题讨论】:

  • 在这里查看我的最小示例:stackoverflow.com/questions/25613212/… 它适用于 WUA8.1,但它仍然适用于您的 W10 项目。
  • Daten.LadeAlleBaustellenDaten.Ziel&lt;Code.Baustelle[]&gt; 是什么?由于您的代码不完整,我无法重现您的问题。你能分享minimal reproducible example吗?另外,你有没有试过像Baustellen = new List&lt;Baustelle&gt; { new Baustelle { strasse = "1" }, new Baustelle { strasse = "2" }, new Baustelle { strasse = "3" } };这样在构造函数中设置Baustellen,这样行吗?

标签: c# xaml win-universal-app windows-10 uwp


【解决方案1】:

值“strasse, hausnr, bauauftrag, status”必须是属性,例如公共大街{得到;放; } 而不是然后绑定到那些,这应该可以工作 - 您可能需要将列表的数据源设置为项目列表。

【讨论】:

  • 我在它们后面设置了 {get;set} 但它仍然不起作用。
  • 使用 x:Bind 时,它们不必是属性。
  • 很高兴知道这一点,我一直假设但很高兴在使用该绑定方法时知道其他情况。
【解决方案2】:

您应该使用ObservableCollection&lt;Baustelle&gt; 而不是List&lt;Baustelle&gt;

【讨论】:

  • 没有必要。任何 IEnumerable 都可以,除非您想对集合进行动态更改。
【解决方案3】:

我已将您的代码粘贴到一个新的应用程序中,进行了最小的调整以使其在您的环境之外编译。绑定工作得很好:

我无权访问您用来加载数据的代码,因此我稍微调整了代码,如下所示(重命名页面,使其与您的模型类名称不同):

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();
}

(为简单起见,我还将KundeOrt 替换为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 字段也消失了。)

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2016-11-18
    • 2023-03-21
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2016-12-01
    相关资源
    最近更新 更多