Установка привязки шаблона в коде позади - PullRequest
0 голосов
/ 23 ноября 2011

Ожидаемый результат будет примерно таким,

<Canvas Width="800" Height="600">
   <Ellipse Stroke="#FF000000" StrokeThickness="2" Width="284" Height="288" 
            ToolTip="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Min}" 
            Canvas.Left="312" Canvas.Top="122" />
</Canvas>

С этим кодом,

//This will ultimately hold object of type UIElement, which is Ellipse in this case.
private DependencyObject selectedObject; 

public void AddBinding(DependencyProperty dependencyProperty, DependencyProperty ipartProperty)
{
    Binding binding = new Binding(ipartProperty.Name); //Here Name is Min, an attached property
    binding.RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent);
    BindingOperations.SetBinding(selectedObject, dependencyProperty, binding);
}

Но фактический результат составляет

<Canvas Width="800" Height="600">
   <Ellipse Stroke="#FF000000" StrokeThickness="2" Width="284" Height="288" 
            ToolTip="{x:Null}" Canvas.Left="312" Canvas.Top="122"/>
</Canvas>

Я не знаю, что не так, может кто-нибудь, пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Нашел ответ.Используйте следующий класс

public class BindingConverter : ExpressionConverter
{
    public override bool CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, Type destinationType)
    {
        return true;
    }

    public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(MarkupExtension))
        {
            BindingExpression bindingExpression = value as BindingExpression;
            if (bindingExpression == null)
            {
                throw new FormatException("Expected binding, but didn't get one");
            }
            return bindingExpression.ParentBinding;
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

Добавьте этот метод к классу от вашего вызова XamlWriter.Save (obj)

private void Register()
    {
        Attribute[] attr = new Attribute[1];
        TypeConverterAttribute vConv = new TypeConverterAttribute(typeof(BindingConverter));
        attr[0] = vConv;
        TypeDescriptor.AddAttributes(typeof(BindingExpression), attr);
    }

И получили ответ, который я хотел !!!Кредит идет Алексу Дову http://www.codeproject.com/script/Membership/View.aspx?mid=106815.Большое спасибо этому парню

0 голосов
/ 23 ноября 2011

Вывод что ?

Если вы используете какой-то вид XamlWriter, вы должны следить за его ограничениями, они не сохраняют привязки, если вы имеете в виду, что это значение свойстваэто также имеет смысл, так как вы не можете привязать к присоединенным свойствам подобное, вам нужен следующий путь: (OwndingClass.AttachedProperty) (обратите внимание на круглые скобки и префикс собственного класса)

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