2013-07-23 2 views
0

Вот код, который я имею в XAML:Связывание в ItemsControl не прорывается к пункту от ItemsSource

 <!-- ItemsControl to print all the GDTs on the map as an overlay on tiles --> 
     <ItemsControl ItemsSource="{Binding GDTs, Mode=OneWay}" Grid.ColumnSpan="3" Grid.RowSpan="3" Panel.ZIndex="7"> 
      <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas ClipToBounds="True" SnapsToDevicePixels="true"/> 
      </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemContainerStyle> 
      <Style TargetType="ContentPresenter"> 
       <Setter Property="Canvas.Left" Value="{Binding DistanceToLeft}"/> 
       <Setter Property="Canvas.Top" Value="{Binding DistanceToTop}"/> 
       <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
        <Grid> 
         <userControls:CommIndicator CommConfig="eDt" DtAntennaMode="eDirectional" DtAzimuth="{Binding Yaw}"/> 
         <Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding SourcePath}" Width="{Binding Width}"/> 
         <Rectangle Height="{Binding Height}" Width="{Binding Width}" Stroke="Orange" StrokeThickness="2"/> 
         <Ellipse Height="4" Width="4" Fill="Orange" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Grid> 
        </DataTemplate> 
       </Setter.Value> 
       </Setter> 
      </Style> 
      </ItemsControl.ItemContainerStyle> 
     </ItemsControl> 

Все привязки там работает для того, что я только что добавил в UserControl (CommIndicator), за исключением: DtAzimuth = "{Binding Yaw}".

Ошибка, которую я вижу в Snoop по этой привязке: «Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: свойство« Yaw »не найдено на« объекте »'' CommIndicator '(Name =' ')' .BindingExpression: Path = Yaw; DataItem = 'CommIndicator' (Name = ''), целевой элемент - CommIndicator (Name = ''); target-свойство - 'DtAzimuth' (type 'Int32') "

Есть ли способ принудительного привязки для проверки в ItemsControl "currentItem"?

EDIT 1: Вот XAML для моего UserControl:

<UserControl x:Class="UserControls.CommIndicator" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" 
      xmlns:userControls="clr-namespace:UserControls" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}" 
      SnapsToDevicePixels="True"> 

    <UserControl.Resources> 
    <ResourceDictionary> 
     <userControls:CommConfigToVisibility x:Key="CommConfigToVisibility"/> 
     <userControls:AntennaModeToAngle  x:Key="AntennaModeToAngle"/> 
     <userControls:AntennaModeToColor  x:Key="AntennaModeToColor"/> 
    </ResourceDictionary> 
    </UserControl.Resources> 

    <Grid Width="100" Height="100"> 
     <!-- Only use this for design reference --> 
     <!--<Grid Width="70" Height="70" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <Ellipse Width="66" Height="66" Stroke="WhiteSmoke" StrokeThickness="3" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <Ellipse Width="66" Height="66" Fill="WhiteSmoke" StrokeThickness="3" HorizontalAlignment="Center" VerticalAlignment="Center" Opacity="0.30"/> 
      <Ellipse Width="70" Height="70" Stroke="LimeGreen" StrokeThickness="3" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="/Resources/BlackShadowTopView.png" Width="40"/> 
      <TextBlock Text="160" Margin="6" HorizontalAlignment="Center" TextAlignment="Center" Foreground="Black"/> 
     </Grid>--> 

     <!-- ADR Communication Circle Indicator --> 
     <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="100" Height="100" 
       Visibility="{Binding CommConfig, Converter={StaticResource CommConfigToVisibility}, ConverterParameter={x:Static userControls:CommType.eDataRelay}}"> 
      <Ellipse Width="100" Height="100" Stroke="Black" StrokeThickness="7"/> 
      <ed:Arc Width="99" Height="99" Fill="SlateGray" StartAngle="0" EndAngle="360" ArcThickness="5"/> 
      <ed:Arc Width="99" Height="99" Stretch="None" ArcThickness="6" 
       Fill="{Binding DrAntennaMode, Converter={StaticResource AntennaModeToColor}}" 
       StartAngle="{Binding DrAntennaMode, Converter={StaticResource AntennaModeToAngle}, ConverterParameter={x:Static userControls:AngleType.eStartAngle}}" 
       EndAngle="{Binding DrAntennaMode, Converter={StaticResource AntennaModeToAngle}, ConverterParameter={x:Static userControls:AngleType.eEndAngle}}"/> 

      <Grid.LayoutTransform> 
      <RotateTransform Angle="{Binding DrAzimuth}"/> 
      </Grid.LayoutTransform> 
     </Grid> 

     <!-- ADT/GDT Communication Circle Indicator --> 
     <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="90" Height="90" 
       Visibility="{Binding CommConfig, Converter={StaticResource CommConfigToVisibility}, ConverterParameter={x:Static userControls:CommType.eDataTransmitter}}"> 
      <Ellipse Width="88" Height="88" Stroke="Black" StrokeThickness="7"/> 
      <ed:Arc Width="87" Height="87" Fill="SlateGray" StartAngle="0" EndAngle="360" ArcThickness="5"/> 
      <ed:Arc Width="87" Height="87" Stretch="None" ArcThickness="6" 
       Fill="{Binding DtAntennaMode, Converter={StaticResource AntennaModeToColor}}" 
       StartAngle="{Binding DtAntennaMode, Converter={StaticResource AntennaModeToAngle}, ConverterParameter={x:Static userControls:AngleType.eStartAngle}}" 
       EndAngle="{Binding DtAntennaMode, Converter={StaticResource AntennaModeToAngle}, ConverterParameter={x:Static userControls:AngleType.eEndAngle}}"/> 

      <Grid.LayoutTransform> 
      <RotateTransform Angle="{Binding DtAzimuth}"/> 
      </Grid.LayoutTransform> 
     </Grid> 
     </Grid> 
    </UserControl> 
+0

Насколько возможно, вы устанавливаете 'DataContext'' CommIndicator' для себя? –

+0

@HighCore Да в моем UserControl Я устанавливаю DataContext для себя. Как я могу сделать иначе, если я хочу привязать некоторые свойства к своим свойствам DependencyProperties? Каков самый чистый способ сделать это? – KOTIX

+1

НИКОГДА, НИКОГДА, НИКОГДА, НИКОГДА не устанавливайте DataContext элемента элемента UI для себя. Опубликуйте XAML для UserControl. –

ответ

1

удалить это:

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

от UserControl, и добавить:

<UserControl ... 
      x:Name="view"> 

И изменения все ваши привязки внутри usecontrol для использования ElementName, например:

{Binding ElementName=view, Path=DtAntennaMode, Converter={StaticResource AntennaModeToColor}}"

Кроме того, там, кажется, много конвертеров, происходящих там. Я настоятельно рекомендую вам изменить все это, используя ControlTemplate и внутри которого вы можете положить ControlTemplate.Triggers и удалить необходимость в конвертерах и хакерах DataContext.

+0

Я попробовал: '<Сетка Ширина = "100" высота = "100"> ' На главной сетке и он швы работает, не меняя всех привязок. Большое спасибо ! – KOTIX

Смежные вопросы