WPF:为什么我不能绑定数据?
本文关键字:绑定 数据 不能 为什么 WPF | 更新日期: 2023-09-27 18:12:35
<Window x:Class="GuessFigure.PlayingGameWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GuessFigure"
mc:Ignorable="d"
Title="PlayingGame" Height="300" Width="300">
<Grid
xmlns:c="clr-namespace:GuessFigure.Model">
<Grid.Resources>
<c:Round x:Key="round"/>
</Grid.Resources>
<Grid.DataContext>
<Binding Source=" {StaticResource round}" />
</Grid.DataContext>
<TextBlock x:Name="tbTime" HorizontalAlignment="Left" Margin="108,202,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top"/>
<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="123,86,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
<TextBlock x:Name="roundNumber" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Text="{Binding Path=Number}"/>
</Grid>
</Window>
Round.cs:
using GuessFigure.Model.Factory;
using Ninject;
using Ninject.Modules;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ninject.Planning.Bindings;
namespace GuessFigure.Model
{
/// <summary>
/// 回合
///
/// 每回合限时30s,超时直接进入下一回合
///
/// 题目(数字)由FigureFactory类生产
/// </summary>
///
class Round
{
/// <summary>
/// 回合数
///
/// 一共五回合,每回合出一道猜数字的题目
/// </summary>
internal int Number { get; } = 1;
/// <summary>
/// 生产题目的工厂
/// </summary>
private FigureFactory figureFactory;
[Inject]
internal void SetFigureFactory(FigureFactory figureFactory)
{
this.figureFactory = figureFactory;
}
/// <summary>
/// 调用<see cref=">FigureFactory"/>
/// </summary>
/// <returns>
/// 当前回合的题目。
/// </returns>
public int[] GetCurrentRoundFigures()
{
return figureFactory.Produce(Number);
}
}
class RoundModule : NinjectModule
{
public override void Load()
{
Bind<FigureFactory>().To<FigureFactoryRound1>().When(request=>request.ParentRequest.Target.Type.GetField("number").Equals(1));
Bind<FigureFactory>().To<FigureFactoryRound2>().When(request => request.Target.Type.GetField("number").Equals(2));
Bind<FigureFactory>().To<FigureFactoryRound3>().When(request => request.Target.Type.GetField("number").Equals(3));
Bind<FigureFactory>().To<FigureFactoryRound4>().When(request => request.Target.Type.GetField("number").Equals(4));
Bind<FigureFactory>().To<FigureFactoryRound5>().When(request => request.Target.Type.GetField("number").Equals(5));
}
}
}
我想将类Round
的属性Number
绑定到Grid
中的第二个TextBlock
并显示给用户。然而,在我编写这些代码之后,没有显示任何内容。
我的代码有什么问题?
System.Windows。数据错误:40:BindingExpression路径错误:'Number'在"对象"上找不到属性"字符串"(HashCode=-1455514144)"。BindingExpression:路径=数量;DataItem = '字符串'(HashCode = -1455514144);目标元素是'TextBlock'(Name = ' roundNumber ');目标属性为"Text"(类型为"String")
相关问题可能有所帮助:WPF/XAML属性'object'
你绑定的属性必须是公共的,你的属性是内部的。看到这里。
用作绑定源属性的属性必须是类的公共属性。显式定义的接口属性不能用于绑定目的,也不能访问没有基本实现的受保护的、私有的、内部的或虚拟的属性。
,这个:
request.Target.Type.GetField("number").Equals(2)
将无法工作,因为:
-
Number
有大写N - 是一个属性
-
GetField("Number") returns a
FieldInfo的实例,而不是值。
那么你可以这样做:
request.Target.Type.GetProperty("number").GetValue(request.Target, null).Equals(2)
首先,我的代码有多个错误,感谢Maarten指出
你绑定的属性必须是public的,你的属性是internal的。
然而,这还不够,问题仍然存在。我最终解决了我的问题,通过删除<Binding Source=" {StaticResource round}" />
中{StaticResource round}
之前的空格。
- 你试图绑定一个属性到一个内部属性是错误的。该属性只能绑定到公共属性。
- 公共属性建议首字母大写。