2011-07-28 122 views
1

我有實現自定義的DependencyObject問題:轉換器依賴屬性

我需要一個轉換器設置或綁定屬性中清除一個枚舉標誌。因此,我用兩個DependencyProperties創建了一個從FrameworkElement中刪除的IValueConverter:標誌(由轉換器設置/未設置的標誌)和標誌(要修改的值/屬性)。父級UserControl(Name = EnumerationEditor)提供了轉換器綁定到的屬性。

ListBox生成CheckBoxes和用於通過DataTemplate修改屬性的轉換器實例。每個CheckBox/converter實例都用於一個標誌。我用下面的XAML代碼:

<ListBox Name="Values" SelectionMode="Extended" BorderThickness="1" BorderBrush="Black" Padding="5"> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type system:Enum}"> 

      <DataTemplate.Resources> 
       <Label x:Key="myTestResource" x:Shared="False" 
          Content="{Binding}" 
          ToolTip="{Binding Path=Value, ElementName=EnumerationEditor}" 
          Foreground="{Binding Path=Background, ElementName=EnumerationEditor}" 
          Background="{Binding Path=Foreground, ElementName=EnumerationEditor}"/> 
       <converters:EnumerationConverter x:Key="EnumerationConverter" x:Shared="False" 
                Flag="{Binding}" 
                Flags="{Binding Path=Value, ElementName=EnumerationEditor}"/> 
      </DataTemplate.Resources> 

      <StackPanel Orientation="Horizontal"> 
       <CheckBox Content="{Binding}" IsChecked="{Binding Path=Value, ElementName=EnumerationEditor, Converter={StaticResource EnumerationConverter}}"/> 
       <ContentPresenter Content="{StaticResource myTestResource}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

奇怪的:標籤工作正常 - 但轉換器不能。我得到的錯誤:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=EnumerationEditor'. BindingExpression:Path=Value; DataItem=null; target element is 'EnumerationConverter' (Name=''); target property is 'Flags' (type 'Enum')

我不明白爲什麼,結合基本相同......

這裏是轉換器的代碼:

public class EnumerationConverter : FrameworkElement, IValueConverter 
{ 

    #region IValueConverter 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Parity.Space; 
    } 

    #endregion 

    #region public Enum Flag { get; set; } 

    public Enum Flag 
    { 
     get { return (Enum)this.GetValue(EnumerationConverter.FlagProperty); } 
     set { this.SetValue(EnumerationConverter.FlagProperty, value); } 
    } 

    /// <summary> 
    /// Dependency property for Flag. 
    /// </summary> 
    public static readonly DependencyProperty FlagProperty = DependencyProperty.Register("Flag", typeof(Enum), typeof(EnumerationConverter)); 

    #endregion 

    #region public Enum Flags { get; set; } 

    public Enum Flags 
    { 
     get { return (Enum)this.GetValue(EnumerationConverter.FlagsProperty); } 
     set { this.SetValue(EnumerationConverter.FlagsProperty, value); } 
    } 

    /// <summary> 
    /// Dependency property for Flags. 
    /// </summary> 
    public static readonly DependencyProperty FlagsProperty = DependencyProperty.Register("Flags", typeof(Enum), typeof(EnumerationConverter)); 

    #endregion 

} 
+0

是你的用戶控件的EnumerationEditor部分,你只發布了列表框 – anivas

+0

@anivas:是的,它是UserControl本身。它有一個依賴性屬性,稱爲類型枚舉的值。但正如您在代碼片段中看到的,我使用與Converter.ToolTip完全相同的綁定。 Label.ToolTip的工作原理 - 它顯示正確的值。但轉換器會產生錯誤。 – Korexio

+0

轉換器不會成爲視覺樹的一部分,這就是爲什麼它找不到它。你想做什麼? – anivas

回答

0

結論

我決定解決使用兩個用戶控件的問題; FlagControl和EnumerationEditorControl。

的FlagControl具有兩個依賴屬性

  • 標誌(System.Enum):決定該標誌被設置/通過控制
  • 值(System.Enum)清除:綁定在屬性格式/值該標誌被設置/清除。

的EnumerationEditorControl具有一個依賴屬性:

  • 值(System.Enum):其中標誌被設定的屬性格式/值。

EnumerationEditorControl使用DataTemplate來實例化FlagControls。 DataTemplate將FlagControl.Flag屬性綁定到DataContext和FlagControl。Value屬性添加到EnumerationEditorControl.Value屬性。

這種方式我不需要轉換器和邏輯顯然是分開的。

感謝您的建議,意見和答覆!

5

A轉換器不是FrameworkElement,所以它不應該繼承該類,最好使用DependencyObject

由於轉換器是不是在綁定將無法工作任何樹,你可以嘗試:

<converters:EnumerationConverter x:Key="EnumerationConverter" x:Shared="False" 
           Flag="{Binding}" 
           Flags="{Binding Path=Value, Source={x:Reference EnumerationEditor}}"/> 

(然而,這應放置在UserControlResources和引用,否則x:Reference會導致循環依賴錯誤。)

注意,Flag結合試圖綁定到DataContext可能不如DataContext工作可能不能被繼承出於同樣的原因是ElementNameRelativeSource瓦特生病沒有工作。

+0

你完全正確 - 標誌綁定不起作用。但是我可以對這兩個項目使用x:Reference解決方案,現在它可以工作。但是我得到了很多System.Windows.Data錯誤(6/23)。需要找出錯誤,但你指出我正確的方向,謝謝! – Korexio