2016-10-11 71 views
0
<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:WPF:为什么我不能绑定数据?

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绑定到第二TextBlockGrid,并展示给用户。但是,我做了这些代码后没有任何显示。

我的代码有什么问题?

System.Windows.Data Error: 40 : BindingExpression path error: 'Number' property not found on 'object' ''String' (HashCode=-1455514144)'. BindingExpression:Path=Number; DataItem='String' (HashCode=-1455514144); target element is 'TextBlock' (Name='roundNumber'); target property is 'Text' (type 'String')

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

+0

您可以在运行应用程序时检查输出窗口是否存在绑定错误? –

+0

@VidasVasiliauskas哦谢谢,输出窗口被其他窗口覆盖,所以我没有发现输出窗口中有错误。 – guo

+0

'Number'不公开,'Round'不实现'INotifyPropertyChanged'(如果你想在初始绑定后更新值) –

回答

1

绑定到该物业必须是公开的,你的财产是内部的。见here

The properties you use as binding source properties for a binding must be public properties of your class. Explicitly defined interface properties cannot be accessed for binding purposes, nor can protected, private, internal, or virtual properties that have no base implementation.

而且,这样的:

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) 
0

首先,我的代码有多个冤屈,并感谢马腾谁表明

The property you bind to has to be public, your property is internal.

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

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

0
  • 您试图将属性绑定到内部属性是错误的。该属性只能绑定到公共属性
  • 公共财产建议首字母大写。
相关问题