数组绑定简单示例不起作用

时间:2015-01-21 11:13:01

标签: c# wpf xaml binding dependency-properties

我对xaml很新,我试图理解Binding问题。我对Array Binding有疑问。我创建了这个非常简单的例子:我有一个带有三个图像的堆栈面板。每张图片都有RotationTransform。每个Angle都是由数组元素获得的(数组是DependencyProperty,称为Rotations)。这是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 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;
        }
    }

绑定仅在第一次(启动时)起作用。当我单击按钮(更改旋转数组)时,绑定不起作用,并且完全忽略了我的图像。

这是一个非常简单的例子,很明显我错过了有关绑定问题的内容。

3 个答案:

答案 0 :(得分:1)

我猜问题是您更改了数组条目的值,但是您没有更改数组本身,因此不会调用'SetValue'。您可以尝试将“旋转”设置为新数组。

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

编辑:我使用我的更改测试了您的代码并且它有效。另一个建议是为数组条目编写一个setter方法并调用'SetValue'或(如注释中建议的那样)使用'INotifyPropertyChanged'而不是DependencyProperty。

答案 1 :(得分: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 = this;

答案 2 :(得分: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);
        }
    }