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 
} 

은 그래서 실버 라이트 클라이언트 응용 프로그램이 신호등 객체를 얻기 위해 필요한 WCF RIA 서비스를 제공 :

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

그래서 잘 작동하는. 나는 나의 목록을 얻고 나는 나의 신호등을 표시 할 격자에 명부를 묶는 것을 결정할 때까지 모두 좋다 ... (추신 : 이것은 sim 도시와 같은 게임이다) :

교통 신호등은 다음과 같다. 그리드에 표시되는 작은 컨트롤을 통해 빛의 상태를 표시합니다 -> 빨간색, 노란색, 녹색, 플러스 다른 것들.

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

그리고 컨트롤 뒤에 코드 : : 지금 내가 당신에게 등 상태 및 ID 보여 단지 있도록

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); 
     } 
     } 
    } 
} 

하는 것은 이제 문제는 어디 페이지 나 그리드가있는 경우 MiniTrafLight 컨트롤을 사용하여 모든 교통 신호등 개체를 표시합니다 - MiniTrafficLight 컨트롤은 작동하지 않습니다 ... 또는 녹색 빨간색 또는 노란색 표시등이 절대로 표시되지 않습니다. 서비스를 디버깅하고 TrafficLightState 속성이 각 트래픽 라이트 객체에 대해 db에서 읽혀질 때 설정되었는지 확인했습니다. 또한 클라이언트 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

그래서 분명히 이에 대한 트릭은 제대로 종속성 속성을 구현하는 것입니다. 알았어!

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 
      { 
       //... 
      } 
     } 
    } 
} 
관련 문제