嗨,我希望我能在这里找到一些帮助...
我正在使用prism和MVVM创建一个WPF应用程序。
我正在尝试创建一个附加属性,我发现here。
在我的ViewModel中,我得到了专注的元素
var control = Keyboard.FocusedElement;
然后我做
string value = ExtraTextBehaviourObject.GetExtraText(control as UIElement);
但返回的值始终为null ...任何人都可以指向正确的方向吗???
更新
public class ExtraTextBehaviourObject : DependencyObject
{
//Declare the dependency property
public static readonly DependencyProperty ExtraTextProperty;
static ExtraTextBehaviourObject()
{
//register it as attached property
ExtraTextProperty = DependencyProperty.RegisterAttached("ExtraText", typeof(string),
typeof(ExtraTextBehaviourObject));
}
//static function for setting the text
public static void SetExtraText(UIElement uiElement, string value)
{
if (uiElement != null)
{
uiElement.SetValue(ExtraTextProperty, value);
}
}
//static function for getting the text
public static string GetExtraText(UIElement uiElement)
{
if (uiElement != null)
{
return (string)uiElement.GetValue(ExtraTextProperty);
}
return "";
}
}
在XAML中设置代码
<dxe:TextEdit Text="{Binding Path=Customer.Comments, Mode=TwoWay}" AcceptsReturn="True" VerticalContentAlignment="Top"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Behaviors:ExtraTextBehaviourObject.ExtraText="HelloExtraText"
ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
答案 0 :(得分:0)
问题是当我使用Keyboard.FocusedElement时,我没有得到正确的控件。当我使用它们的控件时,这可能是一个devexpress的东西。所以向上遍历元素树直到我得到那个控件解决了我的问题......谢谢Clemens!
答案 1 :(得分:0)
只是一个额外的想法:你可以让WPF为你做这件事,而不是亲自遍历树。使用FrameworkPropertyMetadataOptions.Inherits
标记附加属性现在,您可以在设置附加属性的初始控件的所有子项中检索该值。
例如
<Grid MyService.MyProperty="True">
<TextBox .../>
var txt = aSender as TextBox;
var val = MyService.GetMyProperty(txt);
Inherits
GetMyProperty
会返回true
,因为它会继承&#34;来自其父Grid的值,当然没有继承值,false
(不为null,因为它是一个值类型)。
DataContext
也是一个继承的依赖属性。