C# 如何绑定到资源

C# 如何绑定到资源,c#,wpf,xaml,user-controls,C#,Wpf,Xaml,User Controls,对于我来说,这是一个复杂的设置,我正在与一些约束作斗争。为了重现这种情况,我创建了一个新的WPF项目,它删除了除此问题以外的所有问题 我的主窗口在代码隐藏中设置了它的datacontext(this.datacontext=this;)。在主窗口中,有一个单用户控件。我的研究表明,UserControl自动从其父级继承DataContext。因此,为了让UserControl拥有自己的DataContext,我可以在代码中使用类似于MyUserControlsCanvas.DataContext

对于我来说,这是一个复杂的设置,我正在与一些约束作斗争。为了重现这种情况,我创建了一个新的WPF项目,它删除了除此问题以外的所有问题

我的主窗口在代码隐藏中设置了它的datacontext(this.datacontext=this;)。在主窗口中,有一个单用户控件。我的研究表明,
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>
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>
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位置之外,这工作正常


我不确定是否理解您的目的,但如果您有MoveMe xaml,如:

<UserControl...>
    <Thumb x:Name="root" DragDelta="ResizeThumb_DragDelta">
        <Thumb.Template>
            <ControlTemplate>
                <Rectangle Fill="Blue"/>
            </ControlTemplate>
        </Thumb.Template>
    </Thumb>
</UserControl>
<Grid>
    <Grid.Background>
        <SolidColorBrush Color="LightSkyBlue" Opacity=".1"></SolidColorBrush>
    </Grid.Background>
    <myControl:MoveMe Width="30" Cursor="SizeWE" 
Test="{Binding RelativeSource={RelativeSource AncestorType=myControl:MyControl}, Path=ValueOfLeftBorder, Mode=OneWayToSource}"
Margin="-2 0 0 0" VerticalAlignment="Stretch" HorizontalAlignment="Left" BorderThickness="2" 
BorderBrush="LightGreen"/>
</Grid>
和MyControl xaml类似:

<UserControl...>
    <Thumb x:Name="root" DragDelta="ResizeThumb_DragDelta">
        <Thumb.Template>
            <ControlTemplate>
                <Rectangle Fill="Blue"/>
            </ControlTemplate>
        </Thumb.Template>
    </Thumb>
</UserControl>
<Grid>
    <Grid.Background>
        <SolidColorBrush Color="LightSkyBlue" Opacity=".1"></SolidColorBrush>
    </Grid.Background>
    <myControl:MoveMe Width="30" Cursor="SizeWE" 
Test="{Binding RelativeSource={RelativeSource AncestorType=myControl:MyControl}, Path=ValueOfLeftBorder, Mode=OneWayToSource}"
Margin="-2 0 0 0" VerticalAlignment="Stretch" HorizontalAlignment="Left" BorderThickness="2" 
BorderBrush="LightGreen"/>
</Grid>


拖动
MoveMe

我不确定我是否理解您的目的,但如果您有一个MoveMe xaml,如:

<UserControl...>
    <Thumb x:Name="root" DragDelta="ResizeThumb_DragDelta">
        <Thumb.Template>
            <ControlTemplate>
                <Rectangle Fill="Blue"/>
            </ControlTemplate>
        </Thumb.Template>
    </Thumb>
</UserControl>
<Grid>
    <Grid.Background>
        <SolidColorBrush Color="LightSkyBlue" Opacity=".1"></SolidColorBrush>
    </Grid.Background>
    <myControl:MoveMe Width="30" Cursor="SizeWE" 
Test="{Binding RelativeSource={RelativeSource AncestorType=myControl:MyControl}, Path=ValueOfLeftBorder, Mode=OneWayToSource}"
Margin="-2 0 0 0" VerticalAlignment="Stretch" HorizontalAlignment="Left" BorderThickness="2" 
BorderBrush="LightGreen"/>
</Grid>
和MyControl xaml类似:

<UserControl...>
    <Thumb x:Name="root" DragDelta="ResizeThumb_DragDelta">
        <Thumb.Template>
            <ControlTemplate>
                <Rectangle Fill="Blue"/>
            </ControlTemplate>
        </Thumb.Template>
    </Thumb>
</UserControl>
<Grid>
    <Grid.Background>
        <SolidColorBrush Color="LightSkyBlue" Opacity=".1"></SolidColorBrush>
    </Grid.Background>
    <myControl:MoveMe Width="30" Cursor="SizeWE" 
Test="{Binding RelativeSource={RelativeSource AncestorType=myControl:MyControl}, Path=ValueOfLeftBorder, Mode=OneWayToSource}"
Margin="-2 0 0 0" VerticalAlignment="Stretch" HorizontalAlignment="Left" BorderThickness="2" 
BorderBrush="LightGreen"/>
</Grid>


通过拖动
MoveMe

来更新您的
leftborder
值。您不是想向所有者MoveMe而不是主窗口注册测试吗?这行代码:是多余的,它将以任何方式继承其父数据上下文。Test=“{Binding HOW_DO_I_BIND_HERE}”,您不想绑定到什么?你的窗口?@eranotzap,不,我想知道Y位置的值。我更新了我的问题以显示我的真实想法after@DaveRookY的位置在哪里,屏幕上的哪个元素保持它?(作为DP或其DataContext的属性)?仅供参考,知道您想要Y位置作为绑定到兔子的位置并没有改变我的问题,您试图绑定到的可视化树是什么元素?您不是想向所有者MoveMe而不是MainWindow注册测试吗?这行代码:是多余的,它将以任何方式继承其父级的DataContext。Test=”{Binding HOW_DO_I_BIND_HERE}“,你不想绑定到什么?你的窗口?@eranotzap,不,我想知道Y位置的值。我更新了我的问题,以显示我到底在做什么after@DaveRookY位置在哪里,屏幕中的哪个元素持有它?(作为DP或其DataContext的属性)?仅供参考,知道你想要Y位置作为绑定到兔子的位置并没有改变我的问题,你想要绑定到的视觉树是什么元素?好的,我已经复制并粘贴了代码,一切都很好。我现在要用这个更新真实的项目,所以请不要认为我没有响应,或者我忘记了这里有一个延迟!:)慢慢来dave;)谢谢,这简化了我的方法,我的代码和它的工作!好的,我已经复制和粘贴了代码,一切都很好。我现在要用这个更新真实的项目,所以请不要认为我没有回应,或者我忘记了是否有延迟!:)慢慢来dave;)谢谢,这简化了我的批准我的代码和它的工作!