2013-03-11 4 views
0

Прежде всего я попытаюсь объяснить, что я делаю. Я пытаюсь нарисовать шахматную доску. У меня есть пользовательский CONTROLL для ячейкиSilverlight: привязка к сложному свойству

<Grid x:Name="LayoutRoot"> 
     <Border BorderThickness="0" Margin="0" Background="{Binding CellColor, ElementName=userControl, Mode=TwoWay}"/> 
     <Border x:Name="ValidMoveMarker" BorderThickness="0" Margin="0" Background="#FFC1CAB4" Opacity="0"/> 
     <Image x:Name="img" Source="{Binding source, ElementName=userControl, Mode=TwoWay}" Cursor="Hand"/> 

В коде позади этого CellControl у меня есть 2 dpProperties

public eColor? PieceColor 
    { 
     get { return (eColor?)GetValue(PieceColorProperty); } 
     set { SetValue(PieceColorProperty, value);} 
    } 
    public static readonly DependencyProperty PieceColorProperty = DependencyProperty.Register("PieceColor", typeof(eColor?), typeof(CellControl), null); 


    public eType? PieceType 
    { 
     get { return (eType?)GetValue(PieceTypeProperty); } 
     set { SetValue(PieceTypeProperty, value);} 
    } 
    public static readonly DependencyProperty PieceTypeProperty = DependencyProperty.Register("PieceType", typeof(eType?), typeof(CellControl), null); 

где Ecolor и ETYPE являются счетчиками. Здесь у меня есть одно свойство

public ImageSource source 
     { 
      get 
      { 
       if (PieceColor == eColor.White) 
       { 
        switch (PieceType) 
        { 
         case eType.Pawn: 
          return new BitmapImage(new Uri("/PO.PC;component/Images/chess_piece_white_pawn_T.png", UriKind.Relative)); 
         case eType.Knight: 
          return new BitmapImage(new Uri("/PO.PC;component/Images/chess_piece_white_knight_T.png", UriKind.Relative)); 
            ... 
         default: 
          return null; 
        } 
       } 
       else 
       { 
        switch (PieceType) 
        { 
         case eType.Pawn: 
        } 
       } 
      } 

проблема теперь, когда я пытаюсь использовать элемент управления, как этот

<PP_Controls:CellControl PieceType="{Binding type, Mode=TwoWay}" PieceColor="{Binding color, Mode=TwoWay}" 

где происходит

private eColor? _color; 
    public eColor? color 
    { 
     get { return _color; } 
     set 
     { 
      _color = value; 
      OnPropertyChanged("color"); 
     } 
    } 

    private eType? _type; 
    public eType? type 
    { 
     get { return _type; } 
     set 
     { 
      _type = value; 
      OnPropertyChanged("type"); 
     } 
    } 

бездельники. Но если я использую такое управление

<PP_Controls:CellControl PieceType="Bishop" PieceColor="Black" 

он отлично работает. Я что-то пропустил в своих привязках? Это потому, что свойство «source» не является самим свойством зависимостей? Как я могу решить проблему?

ответ

0

Ваши целевые свойства являются свойства зависимостей, и свойства источника являются свойства CLR, реализующие INotifyPropertyChanged, так что ваши привязки {Binding type} и т.д. должны работать - предполагая что DataContext на ваш «использовать с привязкой» тип с цветом/типом свойства. Вы должны быть в состоянии определить, не связаны ли эти привязки, просмотрев окно вывода при запуске приложения в отладчике (в Silverlight 5 вы также можете использовать точку останова привязки, иначе вы можете применить тривиальный ValueConverter к привязке к набору точка останова для отладки).

Однако свойство вашего управления source зависит от других свойств в 'ленивом' порядке. Вы привязываетесь к свойству source, но ничто не заставит эту привязку обновляться при изменении значения вычисляемого свойства. Вы должны добавить обработчик с изменением свойства зависимостей к PieceColor и PieceType, который вызывает OnPropertyChanged("source") (или эквивалентно преобразовать его в DP или уведомляющее свойство и явно пересчитать значение).

+0

Ровно! Это ключевой момент: «Вы должны добавить обработчик измененного свойства зависимостей к PieceColor и PieceType, который вызывает OnPropertyChanged (« source »)». Также мне не хватало тега ElementName в PieceType = "{Тип привязки, Mode = TwoWay}" –

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