2012-05-10 67 views
0

編輯:我根據Thorstens Answer使用枚舉更改了代碼,但沒有工作。如何直接在WPF中使用自定義依賴屬性?

我正在使用依賴屬性來影響我創建的WPF控件。我是新來的WPF,所以我不知道我做錯了什麼,我找不到解釋它的適當文章。

例如,我試圖通過Dep屬性定義控件的可見性。該物業,在這種情況下,會是這樣:

public static readonly DependencyProperty IconVisibilityBoldProperty = 
DependencyProperty.Register("IconVisibilityBold", typeof(Visibility), typeof(RTFBox), 
new PropertyMetadata(Visibility.Hidden), VisibilityValidateCallback); 
private static bool VisibilityValidateCallback(object value) 
{ 
Visibility prop = (Visibility) value; 
if (prop == Visibility.Hidden || prop == Visibility.Visible) 
{ 
    return true; 
} 
return false; 
} 
public Visibility IconVisibilityBold 
{ 
get 
{ 
    return (Visibility)GetValue(IconVisibilityBoldProperty); 
} 
set 
{ 
    SetValue(IconVisibilityBoldProperty, value); 
} 
} 

編輯:正確XAML,尋找Slugarts答案。 的XAML項對於這一點,在這種情況下,切換按鈕,將

<ToggleButton Visibility="{Binding Path=IconVisibilityBold}" ToolBar.OverflowMode="Never" x:Name="ToolStripButtonBold" Command="EditingCommands.ToggleBold" ToolTip="Bold"> 
<Image Source="Images\Bold.png" Stretch="None"/> 
</ToggleButton> 

我已經輸出的屬性,它顯示爲「隱藏」的元數據默認值應該暗示,但顯然我已經做了一些綁定錯誤。我需要在那裏寫什麼?

+0

您是否正在創建新的自定義或用戶控件?或者你只是改變ToggleButton的數據模板?您的屬性定義在哪個類中? – Slugart

+0

我只想根據屬性值隱藏按鈕,屬性在按鈕和其他控件所在的同一類中定義。 (在這種情況下命名爲「RTFBox」 – Andreas

回答

2

您正在試圖引用不綁定到父控件的屬性,它不會被隱式設置。您需要將ToggleButton綁定中的ElementName設置爲您正在創建的UserControl的名稱(如果它尚未具有x屬性,則給它一個x:Name屬性)。

<UserControl x:Name="rtfBox"> 
<ToggleButton Visibility="{Binding ElementName=rtfBox, Path=IconVisibilityBold}" ... /> 
... 
</UserControl> 

此外,您應該按照以前的答案,正確地聲明Visibility屬性是枚舉而不是字符串。

+0

所以我認爲你的意思是像_ Andreas

+0

@安德烈亞斯我已經用代碼更新了我的答案... – Slugart

+0

非常感謝,這有助於它的工作! – Andreas

1

所以你的財產是一個字符串...但它必須是一個枚舉:

namespace System.Windows 
{ 
    public enum Visibility : byte 
    { 
     Visible, 
     Hidden, 
     Collapsed, 
    } 
} 

你必須綁定文本框中的DataContext或使用它作爲參考來訪問屬性正確

+0

哎呦,意外地寫我的答案作爲評論:-)所以你打敗了我。 –

+0

我已經更改屬性,因此: public static readonly DependencyProperty IconVisibilityBoldProperty = DependencyProperty.Register(「IconVisibilityBold」,typeof(Visibility),typeof(RTFBox),new PropertyMetadata(Visibility.Hidden)); 但它似乎仍然不能正常工作(setters,getters和變量相應地改變) – Andreas

+0

請參閱我更改的答案中的代碼 – Andreas

1

ToggleButtonVisibility屬性需要System.Windows.Visibility類型的值。你需要改變你的代碼到改用字符串:

public static readonly DependencyProperty IconVisibilityBoldProperty = 
DependencyProperty.Register("IconVisibilityBold", typeof(System.Windows.Visibility), typeof(RTFBox)); 

public System.Windows.Visibility IconVisibilityBold 
{ 
get 
{ 
    return (System.Windows.Visibility)GetValue(IconVisibilityBoldProperty); 
} 
set 
{ 
    SetValue(IconVisibilityBoldProperty, value); 
} 
} 
+0

謝謝,這有助於它的工作! – Andreas

+0

對不起,我只能接受一個答案作爲解決方案:( – Andreas