2011-10-18 6 views
0

私はWCF RIA POCOオブジェクトを持っています - >そのトラフィックの状態を説明する列挙型を持つトラフィックライト。Silverlight 4 - 列挙型のPOCOオブジェクトではバインディングが機能しません。

[DataContract] 
public class TrafficLight 
{ 
    [Key] 
    [DataMember] 
    public long Id { get; set; }  

    [DataMember] 
    public Longitude Longitude { get; set; } 

    [DataMember] 
    public Latitude Latitude { get; set; } 

    [DataMember] 
    public TrafficLightState SelectedLight { get; set; } 
} 

[DataMember] 
public enum TrafficLightState 
{ 
    [EnumMember] 
    Red = 0, 

    [EnumMember] 
    Yellow = 1, 

    [EnumMember] 
    Green = 2 
} 

だから私は、Silverlightのクライアントアプリケーションにこのトラフィックライトオブジェクトを取得するために必要なWCF RIAサービスを与えられた:

public IEnumerable<TrafficLight> GetTrafficLightsForCity(int cityId) 
{ 
    return Data.GetTrafficLightsForCity(cityId).AsEnumerable(); 
} 

ので、正常に動作しています。私は私の信号を表示するグリッドにリストをバインドすることを決めるまで私のリストを得て、すべては良いです...(PS。これはsim都市のようなゲームです):

グリッドに表示される小さなコントロールを介して、光の状態を表示する - >赤、黄、緑、いくつかの他のもの。今の私はちょうどあなたのライトステータスとIDが表示されます:

<UserControl x:Name="MiniTrafficLightControl" x:Class="UI.MiniTrafficLight" 
    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" 
    mc:Ignorable="d" 
    d:DesignHeight="15" 
    d:DesignWidth="15" 
    Width="15" Height="15"> 
    <StackPanel Orientation="Horizontal"> 
     <Border x:Name="BrdGreen" Visibility="Visible" CornerRadius="10" Width="15" Height="15" Margin="0" ToolTipService.ToolTip="Runing" d:IsLocked="True"> 
     <Border.Background> 
      <RadialGradientBrush GradientOrigin="0.4,0.3" Center="0.4,0.3" RadiusX="0.5" RadiusY="0.5"> 
      <RadialGradientBrush.GradientStops> 
       <GradientStop Color="LightGreen" Offset="0" /> 
      <GradientStop Color="Green" Offset="0.95" /> 
      </RadialGradientBrush.GradientStops> 
     </RadialGradientBrush> 
     </Border.Background> 
    </Border> 
    <Border x:Name="BrdYellow" Visibility="Collapsed" CornerRadius="10" Width="15" Height="15" Margin="0" ToolTipService.ToolTip="Action Pending" d:IsHidden="True" d:IsLocked="True"> 
     <Border.Background> 
      <RadialGradientBrush GradientOrigin="0.4,0.3" Center="0.4,0.3" RadiusX="0.5" RadiusY="0.5"> 
      <RadialGradientBrush.GradientStops> 
       <GradientStop Color="Yellow" Offset="0" /> 
      <GradientStop Color="Orange" Offset="0.95" /> 
      </RadialGradientBrush.GradientStops> 
     </RadialGradientBrush> 
     </Border.Background> 
    </Border> 
    <Border x:Name="BrdRed" Visibility="Collapsed" CornerRadius="10" Width="15" Height="15" Margin="0" ToolTipService.ToolTip="Stopped" d:IsHidden="True" d:IsLocked="True"> 
     <Border.Background> 
      <RadialGradientBrush GradientOrigin="0.4,0.3" Center="0.4,0.3" RadiusX="0.5" RadiusY="0.5"> 
      <RadialGradientBrush.GradientStops> 
       <GradientStop Color="Orange" Offset="0" /> 
      <GradientStop Color="Red" Offset="0.95" /> 
      </RadialGradientBrush.GradientStops> 
     </RadialGradientBrush> 
     </Border.Background> 
    </Border> 
    </StackPanel> 
</UserControl> 

をそして制御のための背後にあるコード:

namespace UI 
{ 
    public partial class MiniTrafficLight : UserControl 
    { 
     public static readonly DependencyProperty TrafficLightStateProperty = DependencyProperty.Register("TrafficLightState", typeof(TrafficLightState), typeof(MiniTrafficLight), null); 

     public TrafficLightState TrafficLightState 
    { 
     get 
     { 
      return (TrafficLightState)this.GetValue(TrafficLightStateProperty); 
     } 
     set 
     { 
      if (value == TrafficLightState.Red) 
     { 
      this.BrdRed.Visibility = System.Windows.Visibility.Visible; 
      this.BrdGreen.Visibility = System.Windows.Visibility.Collapsed; 
      this.BrdYellow.Visibility = System.Windows.Visibility.Collapsed; 
     } 
     else if (value == TrafficLightState.Yellow) 
     { 
      this.BrdRed.Visibility = System.Windows.Visibility.Collapsed; 
      this.BrdGreen.Visibility = System.Windows.Visibility.Collapsed; 
      this.BrdYellow.Visibility = System.Windows.Visibility.Visible; 
     } 
     else 
     { 
      this.BrdRed.Visibility = System.Windows.Visibility.Collapsed; 
        this.BrdGreen.Visibility = System.Windows.Visibility.Visible; 
      this.BrdYellow.Visibility = System.Windows.Visibility.Collapsed; 
     } 

       this.SetValue(TrafficLightStateProperty, value); 
     } 
     } 
    } 
} 

は今の問題は、どこかのページの場合、私は、グリッドを持っているということですグリッド内のMiniTraficLightコントロールを使用してすべての信号灯オブジェクトを表示する - MiniTrafficLightコントロールは決して動作しません。または、緑色の赤色または黄色のライトは表示されません。私はサービスをデバッグし、トラフィックライトオブジェクトごとにdbから読み取ったときに、TrafficLightStateプロパティが設定されていることを確認しました。また、クライアントSilverlightアプリケーションで、各TrafficLightオブジェクトのTrafficLightStateが正常に到着したことを確認できます(別名...設定されています)。

ただし、MiniTrafficLightのコントロールTrafficLightStateを手動でバインドせずに設定すると機能します。私が綴じを使うと、それは決して現れません。コンバータの有無にかかわらず、MiniTrafficLightコントロールのプロパティは呼び出されません。私が知っている理由は、プロパティの設定アクセサーにMessageBox.Show(...)を追加したため、メッセージボックスが表示されません。ブレークポイントを置くと、決して達成されません。 Bellowは、グリッド内にTraffic Lightオブジェクトを表示するサンプルコードです。

<datagrid:DataGrid x:Name="ReceiverNodesDataGrid" Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True" HorizontalAlignment="Stretch" SelectionMode="Single"> 
    <datagrid:DataGrid.Columns> 
     <datagrid:DataGridTemplateColumn Header="Status"> 
      <datagrid:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <local:MiniTraficLight TrafficLightState="{Binding TrafficLightState}"/> 
     </DataTemplate> 
      </datagrid:DataGridTemplateColumn.CellTemplate> 
    </datagrid:DataGridTemplateColumn> 
     <datagrid:DataGridTextColumn Header="Id" Binding="{Binding Id}" /> 
    </datagrid:DataGrid.Columns> 
</datagrid:DataGrid> 

このバインディングが機能しない理由は何ですか?

おかげですべて、 マーティン

答えて

0

だから明らかにこれまでのトリックは、適切に依存関係プロパティを実装することです。 UGHHHHH!

namespace UI 
{ 
    public partial class MiniTrafficLight : UserControl 
    { 
     private static PropertyMetaData trafficLightStateMetaData = new PropertyMetaData(new PropertyChangedCallBack(TrafficLightState_Changed)); 
     public static readonly DependencyProperty TrafficLightStateProperty = DependencyProperty.Register("TrafficLightState", typeof(TrafficLightState), typeof(MiniTrafficLight), trafficLightStateMetaData); 

     public TrafficLightState TrafficLightState 
     { 
      get { return (TrafficLightState)this.GetValue(TrafficLightStateProperty); } 
      set { this.SetValue(TrafficLightStateProperty, value); } 
     } 

     private static void TrafficLightState_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      MiniTrafficLight sender = d as MiniTrafficLight; 
      TrafficLightState state = (TrafficLightState)e.NewState; 

      if(state == TrafficLightState.Red) 
      { 
       //... 
      } 
      else if (state == TrafficLightState.Yellow) 
      { 
       //... 
      } 
      else 
      { 
       //... 
      } 
     } 
    } 
} 
関連する問題