Binding-Target никогда не устанавливается в пользовательских объектах, объявленных в * .resources; оценка обязательна - PullRequest
1 голос
/ 17 декабря 2009

У меня такой вид xaml:

<Tv:TvPanel
xmlns:Tv="...">
<Tv:TvPanel.Resources>
    <Tv:Parameters x:Key="parameterList">
    <Tv:ParameterDefinition ParameterName="MyParam" InitialValue="123abc">
        <Tv:ValueBinding Value="{Binding ElementName=myTextBox, Path=Text}"/>
    </Tv:ParameterDefinition>
</Tv:Parameters>
<Tv:TvXmlDataProvider x:Key="dataProvider" 
                          Source="http://server/myXml.xml"                     
                          Parameters="{StaticResource parameterList}"/>
</Tv:TvPanel.Resources>
<Tv:TvPage DataContext="{StaticResource dataProvider}" >

    <Tv:TvText      x:Name="myTextBox"
                    Tv:TvPage.Left="360" Tv:TvPage.Top="10"
                    Height="30" Width="200"/>

    <Tv:TvButton    Tv:TvPage.Left="560" Tv:TvPage.Top="10"
                    Content="Search"/>

/ * НЕКОТОРЫЙ БОЛЬШЕ КОДА * /

все элементы управления, расширяющие некоторые стандартные элементы управления wpf (canvas, label, ...).

Классы ParametersDefinition и ValueBinding выглядят так:

    [ContentProperty("ParameterDefinitions")]
public class Parameters
{
    private readonly List<ParameterDefinition> parameterDefinitions = new List<ParameterDefinition>();
    public List<ParameterDefinition> ParameterDefinitions { get { return parameterDefinitions; } }


}

[ContentProperty("ValueBindings")]
public class ParameterDefinition : DependencyObject
{

    public static DependencyProperty ParameterNameProperty = DependencyProperty.Register("ParameterName", typeof (string), typeof (ParameterDefinition), new PropertyMetadata(""));

    public string ParameterName
    {
        get { return (string) this.GetValue(ParameterNameProperty); }
        set{ this.SetValue(ParameterNameProperty, value);}
    }

    public static DependencyProperty InitialValueProperty = DependencyProperty.Register("InitialValue", typeof(object), typeof(ParameterDefinition), new PropertyMetadata(new object()));
    public object InitialValue
    {
        get { return this.GetValue(InitialValueProperty); }
        set { this.SetValue(InitialValueProperty, value); }
    }

    private readonly List<ValueBinding> valueBindings = new List<ValueBinding>();
    public List<ValueBinding> ValueBindings { get { return this.valueBindings; } }

}

public class ValueBinding : DependencyObject
{
    public static DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(ValueBinding), new PropertyMetadata(""));

    public string Value
    {
        get { return (string)this.GetValue(ValueProperty); }
        set { this.SetValue(ValueProperty, value); }
    }
}

Проблема в том, что привязка данных

Value="{Binding ElementName=myTextBox, Path=Text}"

не работает в ValueBinding (значение никогда не устанавливается, всегда имеет значение по умолчанию (и выполняются действия для изменения значения)). Привязка StaticResource в поставщике данных работает отлично, и привязка между элементами в UIElements также работает отлично. Он компилируется, и кажется, что нет никаких проблем с областью имени элемента в Resourcedictionary. Что я пропустил?

Edit1: Я забыл упомянуть вывод консоли VS:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Text; DataItem=null; target element is 'ValueBinding' (HashCode=14342221); target property is 'Value' (type 'String')

В TvPanel DataContext устанавливается на это.

Я пытался получить из Freezable вместо DependencyObject ==> ту же проблему.

Я также пытался связать это так:

        <Tv:ValueBinding>
            <Tv:ValueBinding.Value>
                <Binding ElementName="SearchText" Path="Text"/>
            </Tv:ValueBinding.Value>
        </Tv:ValueBinding>

но без разницы.

1 Ответ

1 голос
/ 17 декабря 2009

Я думаю, что ваш класс должен быть производным от Freezable, иначе нет контекста наследования: DataContext не распространяется и привязки не работают. См. эту статью для получения дополнительной информации.

...