【问题标题】:XAML binding not working in C# UWP appXAML 绑定在 C# UWP 应用程序中不起作用
【发布时间】:2016-04-28 08:54:58
【问题描述】:

我在 XAML 中绑定 ObservableCollection 时遇到问题

班级:

[DataContract]
public class Result
{
    [DataMember]
    public string title { get; set; }

    [DataMember]
    public string href { get; set; }

    [DataMember]
    public string ingredients { get; set; }

    [DataMember]
    public string thumbnail { get; set; }
}

可观察的集合:

private ObservableCollection<Result> resultTest;

用于绑定的 XAML 代码:

<ListView Name="RecipeListView"
                  ItemsSource="{Binding resultTest}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="data:Result">
                    <StackPanel Orientation="Vertical">
                        <TextBlock Name="RecipeTitleTextBlock"
                                   Text="{Binding title}"
                                   Foreground="Black"
                                   FontSize="24">

                        </TextBlock>

                        <Image Name="RecipeImage"
                               Source="{Binding thumbnail}"
                               Width="45"
                               Height="45">
                        </Image>
                    </StackPanel>

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

应用程序启动时一切似乎都是正确的,但没有可见的内容可以绑定到。 谢谢大家的帮助。

【问题讨论】:

  • 顺便说一句,将 observable 集合更改为 public 并没有帮助
  • 您无法绑定到字段。将其更改为public ObservableCollection&lt;Result&gt; resultTest { get; set; }。顺便说一句,每当您遇到 Binding 问题时,请检查 Visual Studio 中的“输出”窗口是否存在绑定表达式错误。他们很有帮助。
  • 你设置了 DataContext 了吗?
  • 这个问题会在 DEBUG 和 RELEASE 配置上重现还是有区别?

标签: c# wpf xaml binding uwp


【解决方案1】:

问题是您将“resultTest”声明为“归档”,而不是属性。 但是,绑定系统使用反射来查找属性,而不是查找“字段”。

将您的 resultTest 声明更改为属性将解决问题。

public ObservableCollection<Result> resultTest {get; private set;}

另外,请确保使用 xaml 或代码隐藏等正确设置 DataContext

this.DataContext = this

或

this.DataContext = new ViewModel()

取决于你的 DataContext 到底是什么。

我的完整 MainWindow.cs 如下所示,并且 ListView 绑定有效。

public sealed partial class MainPage : Page
{
    public ObservableCollection<Result> resultTest { get; private set; }

    public MainPage()
    {
        resultTest = new ObservableCollection<Result>();
        resultTest.Add(new Result() { title = "Hello" });
        resultTest.Add(new Result() { title = "World" });

        this.DataContext = this;

        this.InitializeComponent();
    }
}

【讨论】:

  • 感谢您的回复。所以我按照你说的做了 - 将集合更改为公共属性并在页面构造函数中写入 this.DataContext = this,但不幸的是它仍然没有显示任何内容。
  • 还更改了 xaml(将 Binding 替换为 x:Bind)
  • 你是在 InitializeComponent() 之前还是之后添加了 this.DataContext = this?
  • 我在 InitializeComponent() 之后添加了
  • 我已经添加了完整的 MainPage.cs。
【解决方案2】:

如果您设置了 datacontext(即在您的代码后面有 datacontext=this 或者如果您使用 mvvm,则在窗口中设置您的 datacontext 像这样

<Window.DataContext>
   <local:MainViewModel/>
 </Window.DataContext>

如果你有你的收藏属性设置,比如

public ObservableCollection<Result> resultTest {get;set;}

正如 Szabolcs Desi 建议的那样,我会尝试删除 DataTemplate 上的 x:Datatype="data:Result"。我测试了你减去的代码,它对我有用。

【讨论】:

    【解决方案3】:

    对不起这个愚蠢的问题,问题是我使用了一个静态方法,该方法将 ObservableCollection 返回给一个变量。我想我应该将它删除到一个 void 函数中,并通过内部的 foreach 填充集合。 xaml 中的一切都是正确的。

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2020-05-16
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多