2009-12-17 2 views
1

У меня есть мнение XAML как это:Binding-Target никогда не устанавливается в пользовательских объектах, объявленных в * .resources; связывание оценки терпит неудачу

<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 (холст, этикетки, ...).

Классы Параметры, ParameterDefinition & 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); } 
    } 
} 

Проблема заключается в том, что Databinding

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

не работает в ValueBinding (Значение никогда не устанавливается, всегда имеет значение по умолчанию (и действия выполняются для изменения значения)). Связывание StaticResource в dataprovider отлично работает, и привязка элемента к элементу под 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

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

+0

спасибо за отзыв, но это не решило проблему. в выходной консоли, я получаю сообщение об ошибке «System.Windows.Data Error 2: Connot find управляет FrameworkElement или FrameworkContent для целевого элемента [....] DataItem = null [...]" – CaptainPlanet