Browse Source

Fixed so nodes in the property grid gets DesignItemProperty instances that really represents attached properties when an attached property is used.

When setting a property value as attribute, fixed so namespace prefix is only used for attached properties, and if no prefix is defined for a non-default namespace a new unique prefix is generated.
pull/43/head
Tobias Gummesson 12 years ago
parent
commit
9af480c2ee
  1. 4
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs
  2. 31
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs
  3. 47
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/ExtensionMethods.cs
  4. 21
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs

4
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs

@ -226,7 +226,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
void AddNode(MemberDescriptor md) void AddNode(MemberDescriptor md)
{ {
var designProperties = SelectedItems.Select(item => item.Properties[md.Name]).ToArray(); var designProperties = SelectedItems.Select(item => item.Properties.GetProperty(md)).ToArray();
if (!Metadata.IsBrowsable(designProperties[0])) return; if (!Metadata.IsBrowsable(designProperties[0])) return;
PropertyNode node; PropertyNode node;
@ -252,7 +252,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
Category PickCategory(PropertyNode node) Category PickCategory(PropertyNode node)
{ {
if (Metadata.IsPopularProperty(node.FirstProperty)) return popularCategory; if (Metadata.IsPopularProperty(node.FirstProperty)) return popularCategory;
if (node.FirstProperty.Name.Contains(".")) return attachedCategory; if (node.FirstProperty.IsAttachedDependencyProperty()) return attachedCategory;
var typeName = node.FirstProperty.DeclaringType.FullName; var typeName = node.FirstProperty.DeclaringType.FullName;
if (typeName.StartsWith("System.Windows.") || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls.")) if (typeName.StartsWith("System.Windows.") || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls."))
return otherCategory; return otherCategory;

31
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs

@ -327,21 +327,34 @@ namespace ICSharpCode.WpfDesign.XamlDom
internal XmlAttribute SetAttribute(string value) internal XmlAttribute SetAttribute(string value)
{ {
string ns = ParentObject.OwnerDocument.GetNamespaceFor(PropertyTargetType);
string name; string name;
var element = ParentObject.XmlElement;
if (IsAttached) if (IsAttached)
{
name = PropertyTargetType.Name + "." + PropertyName; name = PropertyTargetType.Name + "." + PropertyName;
string ns = ParentObject.OwnerDocument.GetNamespaceFor(PropertyTargetType);
string prefix = element.GetPrefixOfNamespace(ns);
if (String.IsNullOrEmpty(prefix))
{
prefix = ParentObject.OwnerDocument.GetPrefixForNamespace(ns);
}
if (!string.IsNullOrEmpty(prefix))
{
element.SetAttribute(name, ns, value);
return element.GetAttributeNode(name, ns);
}
}
else else
{
name = PropertyName; name = PropertyName;
var element = ParentObject.XmlElement;
if (string.IsNullOrEmpty(element.GetPrefixOfNamespace(ns))) {
element.SetAttribute(name, value);
return element.GetAttributeNode(name);
} else {
element.SetAttribute(name, ns, value);
return element.GetAttributeNode(name, ns);
} }
element.SetAttribute(name, value);
return element.GetAttributeNode(name);
} }
internal string GetNameForMarkupExtension() internal string GetNameForMarkupExtension()

47
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/ExtensionMethods.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.ComponentModel;
using System.Windows; using System.Windows;
namespace ICSharpCode.WpfDesign namespace ICSharpCode.WpfDesign
@ -23,5 +24,51 @@ namespace ICSharpCode.WpfDesign
Math.Round(rect.Height, PlacementInformation.BoundsPrecision) Math.Round(rect.Height, PlacementInformation.BoundsPrecision)
); );
} }
/// <summary>
/// Gets the design item property for the specified member descriptor.
/// </summary>
public static DesignItemProperty GetProperty(this DesignItemPropertyCollection properties, MemberDescriptor md)
{
DesignItemProperty prop = null;
var pd = md as PropertyDescriptor;
if (pd != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(pd);
if (dpd != null)
{
if (dpd.IsAttached)
{
prop = properties.GetAttachedProperty(dpd.DependencyProperty);
}
else
{
prop = properties.GetProperty(dpd.DependencyProperty);
}
}
}
if (prop == null)
{
prop = properties[md.Name];
}
return prop;
}
/// <summary>
/// Gets if the specified design item property represents an attached dependency property.
/// </summary>
public static bool IsAttachedDependencyProperty(this DesignItemProperty property)
{
if (property.DependencyProperty != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(property.DependencyProperty, property.DesignItem.ComponentType);
return dpd.IsAttached;
}
return false;
}
} }
} }

21
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs

@ -34,7 +34,24 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
/// <summary> /// <summary>
/// Gets the name of the property. /// Gets the name of the property.
/// </summary> /// </summary>
public string Name { get { return FirstProperty.Name; } } public string Name
{
get
{
var dp = FirstProperty.DependencyProperty;
if (dp != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(dp, FirstProperty.DesignItem.ComponentType);
if (dpd.IsAttached)
{
// Will return the attached property name in the form of <DeclaringType>.<PropertyName>
return dpd.Name;
}
}
return FirstProperty.Name;
}
}
/// <summary> /// <summary>
/// Gets if this property node represents an event. /// Gets if this property node represents an event.
@ -366,7 +383,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
if (ValueItem != null) { if (ValueItem != null) {
var list = TypeHelper.GetAvailableProperties(ValueItem.Component) var list = TypeHelper.GetAvailableProperties(ValueItem.Component)
.OrderBy(d => d.Name) .OrderBy(d => d.Name)
.Select(d => new PropertyNode(new[] { ValueItem.Properties[d.Name] }, this)); .Select(d => new PropertyNode(new[] { ValueItem.Properties.GetProperty(d) }, this));
foreach (var node in list) { foreach (var node in list) {
if (Metadata.IsBrowsable(node.FirstProperty)) { if (Metadata.IsBrowsable(node.FirstProperty)) {

Loading…
Cancel
Save