2015-01-21 1 views
1

Я очень новичок в xaml, и я пытаюсь понять проблему Binding. У меня проблема с Array Binding. Я создал этот очень простой пример: у меня есть панель стека с тремя изображениями. Каждое изображение имеет RotationTransform. Каждый Angle получается элементом массива (массив представляет собой DependencyProperty, называемый Rotations). Это XAML простой файл:Array Binding простой пример не работает

<StackPanel Orientation="Vertical"> 
     <Image Source="/Assets/knife.png" Width="50" Height="100" Stretch="Uniform" RenderTransformOrigin="0.5,0.5"> 
      <Image.RenderTransform> 
       <RotateTransform Angle="{Binding ElementName=pageRoot, Path=Rotations[0], Mode=OneWay}"/> 
      </Image.RenderTransform> 
     </Image> 

     <Image Source="/Assets/fork.png" Width="50" Height="100" Stretch="Uniform" RenderTransformOrigin="0.5,0.5"> 
     <Image.RenderTransform> 
      <RotateTransform Angle="{Binding ElementName=pageRoot, Path=Rotations[1], Mode=OneWay}"/> 
     </Image.RenderTransform> 
     </Image> 

     <Image Source="/Assets/spoon.png" Width="50" Height="100" Stretch="Uniform" RenderTransformOrigin="0.5,0.5"> 
      <Image.RenderTransform> 
       <RotateTransform Angle="{Binding ElementName=pageRoot, Path=Rotations[2], Mode=OneWay}"/> 
      </Image.RenderTransform> 
     </Image> 

     <Button x:Name="actionButton" Content="Try Binding!" 
       Click="Op_Click"/>    
    </StackPanel> 

И это мой c# класс: только

public sealed partial class MainPage : Page 
    {   
     public static readonly DependencyProperty RotationsProperty = DependencyProperty.Register("Rotations", typeof(double[]), typeof(MainPage), 
      new PropertyMetadata(new double[3])); 

     public double[] Rotations 
     { 
      get { return (double[])GetValue(RotationsProperty); } 
      set { SetValue(RotationsProperty, value); } 
     } 

     private void Op_Click(object sender, RoutedEventArgs e) 
     { 
      Rotations[0] = 180; 
      Rotations[1] = 130; 
      Rotations[2] = 350; 
     } 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      Rotations[0] = 20; 
      Rotations[1] = 90; 
      Rotations[2] = 180; 
     } 
    } 

связывания работает в первый раз (при запуске). Когда я нажимаю на кнопку (меняя массив Rotations), привязка не работает, и она полностью игнорируется из моих изображений.

Это очень простой пример, поэтому ясно, что я что-то пропустил в связи с проблемой Binding.

ответ

0

Хорошо, я нашел решение, используя ObservableCollection: файл xaml остается тем же самым, но c# класс меняется таким образом:

public sealed partial class MainPage : Page 
    {   
     public static readonly DependencyProperty RotationsProperty = 
      DependencyProperty.Register("Rotations", typeof(ObservableCollection<double>), typeof(MainPage), 
      new PropertyMetadata(new ObservableCollection<double>()));  

     public ObservableCollection<double> Rotations 
     { 
      get { return (ObservableCollection<double>)GetValue(RotationsProperty); } 
      set { SetValue(RotationsProperty, value); } 
     } 

     private void Op_Click(object sender, RoutedEventArgs e) 
     { 
      Rotations[0] = 180; 
      Rotations[1] = 180; 
      Rotations[2] = 320; 
     } 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      Rotations.Add(90); 
      Rotations.Add(90); 
      Rotations.Add(90); 
     } 
    } 
1

Я думаю, проблема в том, что вы меняете значение записей массива, но вы не меняете сам массив, поэтому «SetValue» не вызывается. Вы можете попытаться установить «Вращения» в новый массив.

this.Rotations = new double[] {180, 130, 350}; 

Редактировать: Я проверил ваш код с моими изменениями, и это сработало. Еще одно предложение было бы написать метод setter для записей массива и вызвать «SetValue» или (как предлагается в комментариях) использовать «INotifyPropertyChanged» вместо DependencyProperty.

+0

Ммм ... Постараюсь в данный момент, но это очень weird ... мне нужно генерировать новый массив каждый раз, когда я изменяю элемент? Это сумасшествие :) Нет ли другого метода для этого? – superpuccio

+0

вы должны использовать интерфейс INotifyPropertyChanged, после обновления членов массива поднять событие с использованием имени свойства в качестве параметра – stsur

+0

Или он может сохранить DependencyProperty и просто написать метод setter для обновления значения массива и вызвать SetValue впоследствии. –

0

Попробуйте следующий код:

Xaml:

<StackPanel Orientation="Vertical"> 
    <Image Source="/Assets/knife.png" Width="50" Height="100" Stretch="Uniform" RenderTransformOrigin="0.5,0.5"> 
     <Image.RenderTransform> 
      <RotateTransform Angle="{Binding Rotations[0], Mode=OneWay}"/> 
     </Image.RenderTransform> 
    </Image> 

    <Image Source="/Assets/fork.png" Width="50" Height="100" Stretch="Uniform" RenderTransformOrigin="0.5,0.5"> 
    <Image.RenderTransform> 
     <RotateTransform Angle="{Binding Rotations[1], Mode=OneWay}"/> 
    </Image.RenderTransform> 
    </Image> 

    <Image Source="/Assets/spoon.png" Width="50" Height="100" Stretch="Uniform" RenderTransformOrigin="0.5,0.5"> 
     <Image.RenderTransform> 
      <RotateTransform Angle="{Binding Rotations[2], Mode=OneWay}"/> 
     </Image.RenderTransform> 
    </Image> 

    <Button x:Name="actionButton" Content="Try Binding!" 
      Click="Op_Click"/>    
</StackPanel> 

В коде позади установить DataContext, как показано ниже:

this.DataContext = это;

+0

Нет, ничего не меняется ... спасибо в любом случае. – superpuccio