Silverlight: привязка дочернего элемента управления к свойству в пользовательском элементе управления - PullRequest
8 голосов
/ 07 января 2009

Если у меня определен пользовательский элемент управления:

public partial class MainFooter : UserControl
{
    public System.Windows.Media.Color BkColor;
}

и это xaml:

<UserControl x:Class="Test.MainFooter">
    <Grid x:Name="LayoutRoot">
        <Rectangle x:Name="rctBottom_Background2"
                   HorizontalAlignment="Stretch" 
                   Grid.Row="2">
            <Rectangle.Fill>
                <LinearGradientBrush EndPoint="0.82,0.895" StartPoint="0.911,-0.442">
                    <GradientStop Color="{**How can I bind this to the BkColor property?}"/**>
                    <GradientStop Color="#00FFFFFF" Offset="1"/>
                </LinearGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
    </Grid>
</UserControl>

и используется:

<MyControls:MainFooter x:Name="rcrMainFooter"
                       BkColor="#FFE2B42A">
</MyControls:MainFooter>

Как мне связать цвет GradientStop в прямоугольнике со значением свойства BkColor его пользовательских элементов управления?

Ответы [ 5 ]

8 голосов
/ 27 марта 2010

Часто, когда я видел этот вопрос, я отвечал: «Вы должны сделать это в коде», что звучало для меня как «Привязка Silverlight не поддерживает это» - так что вы должны это сделать » полностью вручную ', установив свойство вручную. Но это не так:

Связывание Silverlight поддерживает это - это просто Silverlight XAML, который не поддерживает.

Вот пример UserControl, который в основном оборачивает DataForm. В конструкторе вы запускаете привязку, которая может привязываться к вашему «свойству пользовательского элемента управления». Надеюсь, если в будущем они изменят поддержку XAML для этого, будет просто вернуться и исправить это.

App.xaml

<AddressControl MyHeader="Shipping Address"/>

AddressControl.xaml

<UserControl>
    <DataForm Name="dfAddress" Header="BOUND IN CODE"/>
</UserControl>

Необязательно: указывает, что вы связали значение в коде с комментарием

AddressControl.xaml.cs

publicAddressControl()
{
    InitializeComponent();

    // bind the HeaderProperty of 'dfAddress' to the 'MyHeader' dependency
    // property defined in this file
    dfAddress.SetBinding(DataForm.HeaderProperty, 
    new System.Windows.Data.Binding { Source = this, 
                                      Path = new PropertyPath("MyHeader") });
}

// standard string dependency property
public string MyHeader
{
    get { return (string)GetValue(MyHeaderProperty); }
    set { SetValue(MyHeaderProperty, value); }
}

public static readonly DependencyProperty MyHeaderProperty = 
       DependencyProperty.Register("MyHeader", typeof(string), 
       typeof(AddressControl), null);

Это связывает свойство MyHeader в моем AddressControl usercontrol со свойством Header в форме данных. Я сделал его «Моим» исключительно для удобства чтения, но на самом деле я использую только «Заголовок» в своем реальном коде.

Настоящий позор, что мы до сих пор не можем сделать это в XAML, но это лучше, чем то, что я сначала попытался: захватить события DataContextChanged, а затем вручную установить все.

1 голос
/ 12 января 2009

Единственный способ - это сделать это программно (например, в событии изменения для BkColor (при условии, что это DependencyProperty), изменить его в других местах вашего элемента управления. В качестве альтернативы вы можете использовать ControlTemplate и использовать TemplateBinding. Если ваш UserControl Обходной путь для этого (например, без поведения / методов / событий), затем замените свой пользовательский элемент управления ContentControl и используйте Template Bindng.

0 голосов
/ 30 июня 2010

Есть еще один вариант. Хотя кажется, что вы не можете связать сами значения цвета, вы можете связать все свойство фона, например, так:

... а потом ...

Public ReadOnly Property Background As Brush
    Get
        Dim lgb As New LinearGradientBrush
        lgb.GradientStops = New GradientStopCollection From {New GradientStop With {.Color = PrimaryColor, .Offset = 0.0}, New GradientStop With {.Color = SecondaryColor, .Offset = 1.0}}
        lgb.StartPoint = New Point(0, 0)
        lgb.EndPoint = New Point(1, 1)
        Return lgb
    End Get
End Property
0 голосов
/ 25 ноября 2009
<LinearGradientBrush EndPoint="0.82,0.895" StartPoint="0.911,-0.442">                    
 <GradientStop Color="{TemplateBinding BackGround}" />
 <GradientStop Color="#00FFFFFF" Offset="1"/> </LinearGradientBrush>
0 голосов
/ 07 января 2009

Посмотрите на это сообщение в блоге: Временное решение для отсутствия ElementName в привязке Silverlight 2.0 . Похоже, это немного отличается от того, что вы пытаетесь сделать, но вы можете изменить его код, чтобы сделать то, что вы хотите. Удачи! : -)

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