Посмотрите на мой ответ на на этот вопрос .
Практически так же, как то, что опубликовал LukeH, с одной дополнительной функцией:
Если у вас есть тип, скажем, MyClass
, со свойством MyProperty
типа int
, вы можете написать this:
Expression> e = x => x.MyProperty;
Здесь выражение e.Body
равно , а не a MemberExpression
, поэтому простое while (me != null) me = me.Expression as MemberExpression
не сработает.
Решение состоит в том, чтобы дополнительно проверить, является ли это UnaryExpression
с NodeType == Convert
или ConvertChecked
.
Возможны и другие сценарии; но для простых цепочек выражений свойств этот подход работает довольно хорошо.
Вы можете попробовать использовать Microsoft.Windows.Themes.ListBoxChrome вместо Border; это то, что используется в шаблоне по умолчанию для TextBox:
<ControlTemplate TargetType="TextBoxBase"
xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
<mwt:ListBoxChrome Name="Bd" SnapsToDevicePixels="True">
<ScrollViewer Name="PART_ContentHost"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</mwt:ListBoxChrome>
<ControlTemplate.Triggers>
<Trigger Property="UIElement.IsEnabled" Value="False">
<Setter TargetName="Bd" Property="Panel.Background"
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
<Setter Property="TextElement.Foreground"
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Вы должны иметь возможность использовать только ListBoxChrome вместо Border, вместо того, чтобы повторно создавать TextBox для соответствия представленному вами коду.
Я смог получить его программически с:
TextBox.BorderBrush = SystemColors.ControlDarkBrush;