C# 更改附加属性的绑定源
如果在附加属性中使用绑定扩展名C# 更改附加属性的绑定源,c#,wpf,binding,attached-properties,C#,Wpf,Binding,Attached Properties,如果在附加属性中使用绑定扩展名 <TextBlock local:MyBehavior.View="{Binding A}" /> <!-- or B --> 我不确定如何在标记行设置绑定属性给定的值: public class ViewModel { public object A { get; set; } public object B { get; set; } } <TextBlock local:MyBehavior.View="A"
<TextBlock local:MyBehavior.View="{Binding A}" /> <!-- or B -->
我不确定如何在标记行设置绑定属性给定的值:
public class ViewModel
{
public object A { get; set; }
public object B { get; set; }
}
<TextBlock local:MyBehavior.View="A" />
附加属性使用哪种类型
与您在视图模型中定义源属性的类型相同,即对象
或附加属性应存储的任何类型的值。类型取决于要存储在附加属性中的值的类型
我要立即设置值吗
注册依赖项属性时,可以为其指定默认值。引用类型(如object)的默认值通常为null
:
public class MyBehavior
{
public static object GetView(DependencyObject obj) => obj.GetValue(ViewProperty);
public static void SetView(DependencyObject obj, object value) => obj.SetValue(ViewProperty, value);
public static readonly DependencyProperty ViewProperty =
DependencyProperty.RegisterAttached("View", typeof(object), typeof(MyBehavior),
new PropertyMetadata(/*default value: */ null, new PropertyChangedCallback(OnPropertyChanged)));
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//...
}
}
与任何其他依赖项属性一样,当您绑定到视图模型时,将自动设置依赖项属性的值,例如:
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
public object A { get; set; } = "value...";
}
<TextBlock local:MyBehavior.View="{Binding A}" />
MainWindow.xaml:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
public object A { get; set; } = "value...";
}
<TextBlock local:MyBehavior.View="{Binding A}" />
如果希望能够将视图模型属性设置为附加属性的值,则应将绑定模式设置为OneWayToSource
:
<TextBlock x:Name local:MyBehavior.View="{Binding A, Mode=OneWayToSource}" />
附加的依赖项属性isself只是可以在任何DependencyObject上设置的另一个依赖项属性
编辑:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
public object A { get; set; } = "value...";
}
<TextBlock local:MyBehavior.View="{Binding A}" />
这个解决方案仍然需要代码隐藏,我的意图是通过附加行为消除它。思想?注意element.Loaded(另请参阅我对@dymanoid的评论),其想法是从附加的行为中设置值,并且只使用绑定传递源(定义哪个属性,A或B应该获得该值) 然后,您可以简单地将附加属性设置为源属性的名称:
public class ViewModel
{
public object A { get; set; }
public object B { get; set; }
}
<TextBlock local:MyBehavior.View="A" />
为了澄清您的问题:是否要在绑定到
A
属性的依赖项属性的OnPropertyChanged
回调中设置ViewModel
的A
属性?“这没道理!”戴马诺德,这就是我来这里的原因。我不知道如何组织使用附加属性。例如,如果我使用bool
并设置local:MyBehavior.View=“True”
,那么这将导致运行回调,在这里我可以执行类似((ViewModel)element.DataContext.A=something
。现在我想在xaml中定义A
。因此具有约束力。还有一个毫无意义的问题;)。这个解决方案仍然需要代码隐藏,我的意图是通过附加行为消除它。思想?注意element.Loaded
(另请参阅我对@dymanoid的评论),其想法是从附加的行为中设置值,并且只使用绑定传递源代码(定义哪个属性,A
或B
,应该获得该值)。没有考虑反射,谢谢。但是绑定更灵活:我可以通过ElementName
绑定到父控件上下文,提供转换器、验证等。。我唯一的问题是弄清楚视图
应该是什么类型(顺便说一句,在上一个编辑版本中,最好使用字符串
)以及如何设置源值(现在如何处理反射)。想法?;)视图的类型取决于源属性的类型。如果源属性可以是任何类型,则视图属性应为object.Agree。若您想对该依赖项属性调用SetValue()
(该属性反过来将设置绑定的源),则这是正确的。但是,如果您调用GetValue()
来获取某些内容(在上次编辑中,它是属性的名称,在我失败的尝试中,它是一个绑定,名为BindingBase
),然后对其进行一些设置,该怎么办呢。这是否更清楚?您可以看到,通过反射,您当前正在传递属性的名称。我想直接传递消息来源。。作为一种约束。。我就在那里卡住了。。我有绑定,但不知道如何使用它来设置其(绑定?)源。