2010-04-06 97 views
0

我有我并不能解决:( 一个问题,我有一个用户控件(XAML文件和CS文件)WPF绑定到当前类属性

在XAML它是这样的:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
x:Class="Demo.CtrlContent" 
x:Name="UserControl" 
d:DesignWidth="598.333" d:DesignHeight="179.133" xmlns:Demo="clr-namespace:Demo" > 
<UserControl.Resources> 
    <Storyboard x:Key="SBSmall"> 
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="(FrameworkElement.Width)"> 
      <SplineDoubleKeyFrame KeyTime="00:00:01" Value="I WANT TO BIND VALUE HERE"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
</UserControl.Resources> 
<Border BorderBrush="#FFC2C0C1" CornerRadius="3,3,3,3" BorderThickness="1,1,1,1" RenderTransformOrigin="0.5,0.5" x:Name="border" Margin="1,3,1,3" HorizontalAlignment="Left" VerticalAlignment="Top" Width="300"> 

和。 CS文件:

public partial class CtrlContent { 

    private mindef W { get { return (mindef) Window.GetWindow(this); } } 
    public double MedWidth { // I WANT BIND THIS VALUE GO TO STORYBOARD VALUE IN XAML ABOVE 
     get { 
      double actualW; 
      if(W == null) actualW = SystemParameters.PrimaryScreenWidth; 
      else actualW = W.WrapMain.ActualWidth; 
      return actualW - border.Margin.Left - border.Margin.Right; 
     } 
    } 
    public double SmlWidth { get { return MedWidth/2; } } 

    public CtrlContent() { this.InitializeComponent(); } 
    public CtrlContent (Content content) { 
     this.InitializeComponent(); 
     Document = content; 
    } 
} 

在我的.cs文件,有一个名为MedWidth财产,并在XAML文件中有一个名为情节串连图板:SBSmall 我想我的故事板值绑定到我的正确ty在类ctrlcontent中。

*的想法是,在故事板是一个动画来控制调整到一定的宽度取决于它的父容器上(宽度是动态的)

任何人?请:) 谢谢!

回答

2

在您的CtrlContent构造函数中,分配DataContext = this;

然后在您的XAML:

<SplineDoubleKeyFrame Value="{Binding Path=MedWidth}" 

这是获得XAML从您的MedWidth财产至少一次在启动时读取的最低要求。如果希望在MedWidth属性更改值时更新数据绑定,则需要在CtrlContent上实现INotifyPropertyChanged并发送更改通知。

请注意,将此分配给DataContext有点sl ha。它将你的整个班级暴露在房子xaml一侧的任何东西上。将UI与逻辑更好地分开将创建一个仅用于数据绑定的单独的小类,并将其分配给CtrlContent构造函数中的DataContext。这也会使INotifyPropertyChanged开销超出主类。

+0

嗨dthorpe, 感谢您的回复。 这是工作,但是当我播放故事板时,它没有正确运行。 如果我在文本框中显示绑定的MedWidth值,它显示的是正确的值,但是当我播放故事板时,它将容器缩小到0(或者空 - 我不确定) 但是,如果我硬编码故事板的值动画好好工作。 – AnD 2010-04-06 09:04:58

+0

您的MedWidth计算取决于其他布局元素的宽度,例如窗口和边框。在完全确定这些外部控件的值之前,可能正在通过数据绑定读取您的MedWidth属性值。尝试将窗口的宽度设置为固定值而不是“自动”,看看是否会改变行为。 – dthorpe 2010-04-06 17:25:32