WPF:为什么我不能绑定数据?

时间:2016-10-11 07:50:41

标签: c# wpf

<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绑定到TextBlock中的第二个Grid并将其显示给用户。但是,在我制作这些代码后没有任何显示。

我的代码有什么问题?

  

System.Windows.Data错误:40:BindingExpression路径错误:'Number'   在'object'''String'(HashCode = -1455514144)'上找不到属性。   BindingExpression:路径=号码;的DataItem = '字符串'   (的HashCode = -1455514144);目标元素是'TextBlock'   (名称= 'roundNumber'); target属性是'Text'(类型'String')

相关问题可能有所帮助:WPF/XAML Property not found on 'object'

3 个答案:

答案 0 :(得分:1)

您绑定的属性必须是公开的,您的属性是内部的。请参阅here

  

用作绑定的绑定源属性的属性必须是类的公共属性。无法为绑定目的访问明确定义的接口属性,也无法访问没有基本实现的受保护,私有,内部或虚拟属性。

另外,这个:

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)

答案 1 :(得分:0)

首先,我的代码有多处错误,感谢Maarten表示

  

您绑定的属性必须是公开的,您的属性是内部的。

然而这还不够,问题仍然存在。我最后解决了我的问题,删除了{StaticResource round}<Binding Source=" {StaticResource round}" />之前的空格。

现在绑定按照我的预期运行。

答案 2 :(得分:0)

  • 您正在尝试将属性绑定到错误的内部属性。该属性只能绑定到公共属性
  • 公共财产建议首字母大写。