从后面的代码获取转换 属性 的绑定

Getting binding of transform property from code behind

我里面有下面的代码 Grid:

<Grid.RenderTransform>
    <TranslateTransform
        X="{Binding X, Converter={StaticResource HorizontalPositionConverter}}"
        Y="{Binding Y, Converter={StaticResource VerticalPositionConverter}}"
    />
</Grid.RenderTransform>

如何在代码隐藏中获取 TranslateTransform.XTranslateTransform.Y 的绑定?我发现 this 问题,但解决方案适用于非嵌套依赖属性。他们在的时候怎么办?我不能考虑绑定到整个 RenderTransform。我正在开发 winrt 应用程序,所以多重绑定不可用。

这是绑定背后的代码。我没有使用转换器,因为我的 X 和 Y 定义为双精度。为了进行正确的绑定,您必须使用 dependecy 属性 或其他通知机制(如 INotifyPropertyChanged 实现)。这是绑定解决方案背后的代码(不是 MVVM)。我添加了按钮来测试移动。 1. XAML代码:

<Window x:Class="TransformBindingSoHelpAttempt.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" x:Name="This">
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
    <Grid.RenderTransform>
        <TranslateTransform
            X="{Binding ElementName=This, Path=X, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
            Y="{Binding ElementName=This, Path=Y, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
    </Grid.RenderTransform>
    <Button Content="Click" Width="100" Height="100" Click="ButtonBase_OnClick"></Button>
</Grid>

2. 后面的代码:

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty XProperty = DependencyProperty.Register(
        "X", typeof (double), typeof (MainWindow), new PropertyMetadata(default(double)));

    public double X
    {
        get { return (double) GetValue(XProperty); }
        set { SetValue(XProperty, value); }
    }

    public static readonly DependencyProperty YProperty = DependencyProperty.Register(
        "Y", typeof (double), typeof (MainWindow), new PropertyMetadata(default(double)));

    private static double _position;

    public double Y
    {
        get { return (double) GetValue(YProperty); }
        set { SetValue(YProperty, value); }
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        X = ++_position;
        Y = _position;
    }
}

更新 1: 这是基于代码隐藏的解决方案,XAML 中没有绑定: 3. 后面的代码:

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }



    public static readonly DependencyProperty XProperty = DependencyProperty.Register(
        "X", typeof (double), typeof (MainWindow), new PropertyMetadata(default(double)));

    public double X
    {
        get { return (double) GetValue(XProperty); }
        set { SetValue(XProperty, value); }
    }

    public static readonly DependencyProperty YProperty = DependencyProperty.Register(
        "Y", typeof (double), typeof (MainWindow), new PropertyMetadata(default(double)));

    private static double _position;

    public double Y
    {
        get { return (double) GetValue(YProperty); }
        set { SetValue(YProperty, value); }
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        X = ++_position;
        Y = _position;
    }

    private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
    {
        var grid = sender as Grid;
        if(grid == null) return;
        var transform = grid.RenderTransform as TranslateTransform;
        if (transform == null)
        {
            transform = InitTransformBinding();
            grid.RenderTransform = transform;
        }
        else
        {
            InitTransformBinding(transform);
        }

    }

    private TranslateTransform InitTransformBinding(TranslateTransform t = null)
    {

        var transform = t ?? new TranslateTransform();
        var xBinding = new Binding();
        xBinding.Source = this;
        xBinding.Path = new PropertyPath("X");
        xBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        xBinding.Mode = BindingMode.TwoWay;
        BindingOperations.SetBinding(transform, TranslateTransform.XProperty, xBinding);
        var yBinding = new Binding();
        yBinding.Source = this;
        yBinding.Path = new PropertyPath("Y");
        yBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        yBinding.Mode = BindingMode.TwoWay;
        BindingOperations.SetBinding(transform, TranslateTransform.YProperty, yBinding);
        return transform;
    }
}

4。 XAML代码:

<Window x:Class="TransformBindingSoHelpAttempt.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" x:Name="This">
<Grid HorizontalAlignment="Center" VerticalAlignment="Center" Loaded="FrameworkElement_OnLoaded">
    <Button Content="Click" Width="100" Height="100" Click="ButtonBase_OnClick"></Button>
</Grid>

更新 2,这里点击每个按钮都会缩放网格。 5. Xaml代码:

Window x:Class="TransformBindingSoHelpAttempt.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:transformBindingSoHelpAttempt="clr-namespace:TransformBindingSoHelpAttempt"
    Title="MainWindow" Height="350" Width="525" x:Name="This">
<Window.DataContext>
    <transformBindingSoHelpAttempt:MainViewModel/>
</Window.DataContext>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
    <ListView ItemsSource="{Binding Items}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate DataType="{x:Type transformBindingSoHelpAttempt:ItemDataContext}">
                            <Grid>
                                <Grid.RenderTransform>
                                    <ScaleTransform
                                            ScaleX="{Binding X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                            ScaleY="{Binding Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                                </Grid.RenderTransform>
                                <Button Content="{Binding ButtonContent}" Command="{Binding ButtonCommand}"/>
                            </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
</Grid>

6. 查看机型:

    public class MainViewModel:BaseObservableObject
{
    public MainViewModel()
    {
        Items = new ObservableCollection<ItemDataContext>(new List<ItemDataContext>
        {
            new ItemDataContext{ButtonContent = "A", X = 1.0, Y = 1.0},
            new ItemDataContext{ButtonContent = "B", X = 1.0, Y = 1.0},
            new ItemDataContext{ButtonContent = "C", X = 1.0, Y = 1.0},
            new ItemDataContext{ButtonContent = "D", X = 1.0, Y = 1.0},
        });
    }
    public ObservableCollection<ItemDataContext> Items { get; set; }
}

public class ItemDataContext:BaseObservableObject
{
    private ICommand _buttonCommand;
    private object _buttonContent;
    private double _x;
    private double _y;

    public double X
    {
        get { return _x; }
        set
        {
            _x = value;
            OnPropertyChanged();
        }
    }

    public double Y
    {
        get { return _y; }
        set
        {
            _y = value;
            OnPropertyChanged();
        }
    }

    public ICommand ButtonCommand
    {
        get { return _buttonCommand ?? (_buttonCommand = new DelegateCommand(Target)); }
    }

    public object ButtonContent
    {
        get { return _buttonContent; }
        set
        {
            _buttonContent = value;
            OnPropertyChanged();
        }
    }

    private void Target(object obj)
    {
        X += 0.2;
        Y += 0.2;
    }
}

7。它的样子:

请记住,最后更新的解决方案是基于 LayouTransform 并在每次单击按钮时重新构建视图(使其缩放)。 此致,