私は自分にとって複雑な設定である拘束力に苦労しています。状況を再現するために、この問題以外のすべてを削除した新しい WPF プロジェクトを作成しました。
私の MainWindow には、コード ビハインドでデータ コンテキストが設定されています (this.DataContext = this;)。MainWindow 内には、単一のユーザー コントロールがあります。私の調査によると、 は親から をUserControl
自動的に継承します。DataContext
したがって、UserControl に独自の DataContext を持たせるために、MyUserControlsCanvas.DataContext = this;
. これは希望どおりに機能します
問題は、私の UserControl にクラスへの参照があり、それが RealtiveSource TemplatedParent を介して継承されているため、バインドできないことです。さて、この部分はおそらく意味をなさないと思いますので、完全なコードを示します (申し訳ありませんが、かなりあります)。
MainWindow.xaml
<Window x:Class="BindingTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:myControl="clr-namespace:BindingTest"
Title="MainWindow" Height="350" Width="525">
<Grid>
<myControl:MyControl />
</Grid>
</Window>
MainWindow.xaml.cs
...
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this; // this is required although not shown why in this example
}
}
MyControl.xaml
<UserControl x:Class="BindingTest.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:myControl="clr-namespace:BindingTest"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Canvas>
<Canvas.Resources>
<ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}">
<Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
<Grid.Background>
<SolidColorBrush Color="LightSkyBlue" Opacity=".1"></SolidColorBrush>
</Grid.Background>
<myControl:MoveMe Width="3" Test="{Binding HOW_DO_I_BIND_HERE}" Cursor="SizeWE" Margin="-2 0 0 0" VerticalAlignment="Stretch" HorizontalAlignment="Left" BorderThickness="2" BorderBrush="LightGreen"/>
</Grid>
</ControlTemplate>
</Canvas.Resources>
<ContentControl Width="130"
MinWidth="50"
x:Name ="MyCanvas"
MinHeight="50"
Canvas.Top="0"
Canvas.Left="1"
Template="{StaticResource ResizeDecoratorTemplate}" />
</Canvas>
</Grid>
</UserControl>
MyControl.xaml.cs
...
public partial class MyControl : UserControl
{
public MyControl()
{
InitializeComponent();
MyCanvas.DataContext = this;
this.ValueOfLeftBorder = 5;
}
//Dependancy properties, properties and methods
public double ValueOfLeftBorder { get; set; }
public double ValueOfRightBorder { get; set; }
}
MoveMe.cs
...
public class MoveMe : Thumb
{
public double Test
{
get { return (double)GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}
public static readonly DependencyProperty TestProperty = DependencyProperty.Register(
"Test",
typeof(double),
typeof(MainWindow));
public MoveMe()
{
base.DragDelta += this.ResizeThumb_DragDelta;
}
private void ResizeThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
//Logic
MessageBox.Show("I Moved");
}
}
MyControl.xaml 内に次のコードがあります
<myControl:MoveMe Width="3" Test="{Binding HOW_DO_I_BIND_HERE}" Cursor="SizeWE" Margin="-2 0 0 0" VerticalAlignment="Stretch" HorizontalAlignment="Left" BorderThickness="2" BorderBrush="LightGreen"/>
テストにバインドしようとしています。
ここでの私の主な目標は、この可動アイテムの Y 位置を見つけることです。開始点と終了点を選択できるタイムラインを作成しています。これは、現在どのように見えるかのスクリーンショットです。これは、開始点 (薄緑色の垂直線) と (暗緑色の垂直線) の Y 位置を知る必要がある以外は正常に機能することに注意してください。