Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改附加属性的绑定源_C#_Wpf_Binding_Attached Properties - Fatal编程技术网

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
),然后对其进行一些设置,该怎么办呢。这是否更清楚?您可以看到,通过反射,您当前正在传递属性的名称。我想直接传递消息来源。。作为一种约束。。我就在那里卡住了。。我有绑定,但不知道如何使用它来设置其(绑定?)源。