WPF привязка к текущему классу - PullRequest
0 голосов
/ 06 апреля 2010

У меня есть проблема, которую я не могу решить :( У меня есть пользовательский элемент управления (файл xaml и файл cs)

в 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 Я хочу привязать значение раскадровки к своему свойству в классе ctrlcontent.

* идея в том, что раскадровка - это анимация, позволяющая изменить размер элемента управления до определенной ширины, в зависимости от его родительского контейнера (ширина является динамической)

кто-нибудь? пожалуйста :) спасибо!

Ответы [ 2 ]

2 голосов
/ 06 апреля 2010

В конструкторе CtrlContent присвойте DataContext = this;

Тогда в вашем xaml:

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

Это минимум, необходимый для того, чтобы xaml прочитал из вашего свойства MedWidth хотя бы один раз при запуске. Если вы хотите, чтобы привязка данных обновлялась при изменении значения свойства MedWidth, вам необходимо реализовать INotifyPropertyChanged для CtrlContent и отправлять уведомления об изменениях.

Обратите внимание, что присвоение этого DataContext является неаккуратным хаком. Это подвергает весь ваш класс чему-либо бегающему на стороне дома. Лучшим отделением пользовательского интерфейса от логики было бы создание отдельного небольшого класса, который используется только для привязки данных, и присвоение его DataContext в конструкторе CtrlContent. Это также исключит накладные расходы INotifyPropertyChanged из основного класса.

0 голосов
/ 06 апреля 2010

Вам необходимо реализовать MedWidth как DependencyProperty .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...