从 ItemsControl 中的代码隐藏获取转换属性的绑定

本文关键字:转换 属性 绑定 获取 代码 ItemsControl 隐藏 | 更新日期: 2023-09-27 18:25:08

Xaml如下:

<ItemsControl
    x:Class="PowersOf2.Windows10.Views.Controls.Board"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:PowersOf2.Windows10.Views.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Name="Root" ItemsSource="{Binding Fields, ElementName=Root}" Loaded="Root_Loaded"
>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid
                Width="{Binding FieldWidth, ElementName=Root}"
                Height="{Binding FieldHeight, ElementName=Root}"
                Loaded="Grid_Loaded" Background="White"
            >
                <Grid.RenderTransform>
                    <TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
                </Grid.RenderTransform>
                <TextBlock Text="{Binding Text}" Foreground="Black"/>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Fields是具有坐标XYFieldIEnumerable。它们由视图模型管理。 FieldWidthFieldHeight是在代码隐藏中计算的依赖项属性。

如何在代码隐藏中获取嵌套依赖项属性(如TranslateTransform.XTranslateTransform.Y(的绑定对象?

更新:

基于此问题:Fredrik 的答案按预期工作,直到您在 xaml 中使用绑定到非嵌套属性的单个嵌入对象,而不是嵌套属性。由于ItemsControl包含我的Grid,因此此问题更加复杂。

代码隐藏如下:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using Windows.UI.Xaml;
namespace Controls
{
    public sealed partial class Board
    {
        public Board()
        {
            InitializeComponent();
        }
        private void Root_Loaded(object sender, RoutedEventArgs e)
        {
            FieldWidth = 100.0;
            FieldHeight = 100.0;
            Fields =
                new Field[]
                {
                    new Field { X = 100, Y = 100, Text = "one" },
                    new Field { X = 300, Y = 300, Text = "two" }
                };
        }
        public double FieldWidth
        {
            get { return (double)GetValue(FieldWidthProperty); }
            set { SetValue(FieldWidthProperty, value); }
        }
        public static readonly DependencyProperty FieldWidthProperty = DependencyProperty.Register(
            "FieldWidth", typeof(double), typeof(Board), new PropertyMetadata(0.0)
        );
        public double FieldHeight
        {
            get { return (double)GetValue(FieldHeightProperty); }
            set { SetValue(FieldHeightProperty, value); }
        }
        public static readonly DependencyProperty FieldHeightProperty = DependencyProperty.Register(
            "FieldHeight", typeof(double), typeof(Board), new PropertyMetadata(0.0)
        );
        public IEnumerable<Field> Fields
        {
            get { return (ObservableCollection<Field>)GetValue(FieldsProperty); }
            set { SetValue(FieldsProperty, value); }
        }
        public static readonly DependencyProperty FieldsProperty = DependencyProperty.Register(
            "Fields", typeof(IEnumerable<Field>), typeof(Board), new PropertyMetadata(null)
        );
        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            // here I want to get binding of RenderTransform's properties
        }
    }
    public class Field : INotifyPropertyChanged
    {
        private int _x;
        public int X
        {
            get { return _x; }
            set
            {
                _x = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("X"));
            }
        }
        private int _y;
        public int Y
        {
            get { return _y; }
            set
            {
                _y = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Y"));
            }
        }
        private string _text;
        public string Text
        {
            get { return _text; }
            set
            {
                _text = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Text"));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
}

从 ItemsControl 中的代码隐藏获取转换属性的绑定

我希望

我没有误解这个问题,但你可以像这样获得转换和绑定项目。

private void Grid_Loaded(object sender, RoutedEventArgs e)
{
    var grid = (Grid)sender;
    //the actual transformation
    var render = (Transform)grid.GetValue(RenderTransformProperty);
    //the field the transformation is bound to
    var field = (Field)grid.DataContext;
    //for now this only works in WPF
    var binding = BindingOperations.GetBinding(render, TranslateTransform.XProperty);
}

对此进行了编辑,但它不适用于 winrt。
方法 BindingOperations.GetBinding 仅在 WPF 中可用。

希望温特早日得到这个。