У меня есть объект WCF RIA POCO -> Светофор, который имеет тип enum, описывающий его состояние.
[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
}
Поэтому, учитывая службу RIA WCF, мне нужно было передать этот объект светофора клиенту SilverlightПриложение:
public IEnumerable<TrafficLight> GetTrafficLightsForCity(int cityId)
{
return Data.GetTrafficLightsForCity(cityId).AsEnumerable();
}
Так что работает отлично.Я получаю свой список, и все хорошо, пока я не решу привязать список к сетке, которая будет отображать мои светофоры ... (PS. Это игра, похожая на сим-город):
Способ трафикаИндикаторы отображаются в сетке с помощью небольшого элемента управления, который отображает состояние индикатора -> красный, желтый, зеленый, а также некоторые другие вещи.Сейчас я просто покажу вам статус Light и идентификатор:
<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 никогда не работает ... или он никогда не отображает зеленый красный или желтый свет.Я отладил сервис и проверил, что свойство TrafficLightState установлено, когда его читают из БД для каждого объекта светофора.Я также могу проверить, что в клиентском приложении silverlight, что TrafficLightState для каждого объекта TrafficLight поступает правильно (иначе ... он установлен).
Однако, если я устанавливаю элемент управления TrafficLightState MiniTrafficLight вручную без привязки, он работает.Если я использую связывание, оно никогда не появляется.С преобразователем или без него это свойство элемента управления MiniTrafficLight никогда не вызывается.Причина, по которой я знаю, заключается в том, что я добавил MessageBox.Show(...)
на метод доступа set свойства, и я не вижу никаких окон сообщений.Если я поставлю точки разрыва - они никогда не достигнут.Ниже приведен пример кода, который отображает объекты светофора внутри сетки:
<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>
Есть идеи, почему эта привязка не работает?
Спасибо всем, Мартин