2016-10-11 77 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
  • 您試圖將屬性綁定到內部屬性是錯誤的。該屬性只能綁定到公共屬性
  • 公共財產建議首字母大寫。
相關問題