绑定从方法获得的属性,返回对象

Posted

技术标签:

【中文标题】绑定从方法获得的属性,返回对象【英文标题】:Binding a property obtained from a method, that returns object 【发布时间】:2021-11-22 12:20:05 【问题描述】:

我在绑定 XAML 文件时遇到问题。有一个 DataContextTemplate 类有一个 GetDisplayParams() 方法。方法GetDisplayParams() 返回一个类型为TemplateDisplayParams 的对象,该对象具有Width 属性。我只需要将TextBox 绑定到此属性,但对我没有任何作用。

.xaml:

<TextBox Text="Binding GetDisplayParams.Width"/> 

.axaml.cs:

public TemplateCompositeAttributesSettingsView(Scripting.Template dataContext) : this()

    DataContext = dataContext;
    Console.WriteLine( ((Scripting.Template)DataContext).GetDisplayParams().Width ); // return int.

错误:

【问题讨论】:

您不能绑定到 WPF 中的方法。因此,您必须将方法结果分配给您可以绑定到的公共属性。 @BionicCode,我会创建一个公共属性,但不幸的是,我无权访问 Template 类的源代码。我试图在 TemplateCompositeAttributesSettingsView.cs 中创建一个属性并为 TextBox 重新分配 DataContext,但我得到一个 System.Reflection.AmbiguousMatchException: "Ambiguous match found." 例如:如果模板类是MainWindow的DataContext,那么您可以从MainWindow的代码隐藏中调用Template.GetDisplayParams方法。在 MainWindow 上创建一个依赖属性,例如 DisplayWidth,它保存方法调用的结果。将您的 TextBox 绑定到依赖属性。您不必更改模板的代码。如果您需要更多帮助,请提供相关代码。您需要显示 TextBox 的 DataContext(如何设置)。 @BionicCode,我最终发现了这个问题。为 TextBox 指定 DataContext = TemplateCompositeAttributesSettingsViewModel 并在那里创建公共属性。我是 WPF 和 Avalonia 的新手,所以我的问题对很多人来说似乎很愚蠢。感谢您的帮助。 没问题。不客气。 【参考方案1】:

正如@BionicCode 所说,在 WPF 中,我认为 XAML 中的 Avalonia 无法绑定到方法。因此,我必须创建一个 TemplateCompositeAttributesSettingsViewModel 并在那里指定一个公共属性,然后将 DataContext TextBox 绑定到这个 ViewModel。

.xaml

<StackPanel Name="MinWidthMinHeightStackPanel" Margin="3.5" Orientation="Horizontal">
            <!--TODO-->
            <TextBox Text="Binding MinWidth"/> 
            <TextBlock Margin="20,0,20,0" Text="x" VerticalAlignment="Center"/>
            <!--TODO-->
            <TextBox Text="Binding MinHeight"/>
</StackPanel>

TemplateCompositeAttributesSettingsView.cs:

public TemplateCompositeAttributesSettingsView(Scripting.Template dataContext) : this()

    DataContext = dataContext;
    var templateCompositeAttributesSettingsViewModel = new TemplateCompositeAttributesSettingsViewModel( dataContext );
    this.FindControl<StackPanel>( "MinWidthMinHeightStackPanel" ).DataContext = templateCompositeAttributesSettingsViewModel;

TemplateCompositeAttributesSettingsViewModel.cs:

class TemplateCompositeAttributesSettingsViewModel : ViewModelBase

    public TemplateCompositeAttributesSettingsViewModel(Scripting.Template DataContext)
    
        this.DataContext = DataContext;
    

    public int MinWidth
    
        get => DataContext.GetDisplayParams().Width;
    

    public int MinHeight
    
        get => DataContext.GetDisplayParams().Height;
    

    public Scripting.Template DataContext  get; set; 

输出: enter image description here

【讨论】:

这很好。但请注意,GetDisplayParams 方法只调用一次。如果返回的结果可以更改,您的视图将不会获得这些更改。绑定 MinHeight 和 MinWIdth 就像将绑定模式设置为 OneTime。 另外,最好将 TemplateCompositeAttributesSettingsViewModel 设为公共只读属性并将 StackPanel 绑定到它,而不是使用 FindControl 在代码隐藏中分配 DataContext。在这种情况下,绑定将如下所示:&lt;StackPanel DataContext="Binding TemplateCompositeAttributesSettingsViewModel"&gt; ... &lt;/StackPanel&gt;

以上是关于绑定从方法获得的属性,返回对象的主要内容,如果未能解决你的问题,请参考以下文章

从C#中的托管对象属性获取值的最佳方法

是否可以获得对象的不可枚举的继承属性名称?

面向对象之静态属性与绑定方法

Pybind11:外部类型作为返回值

面向对象二次整理(基础,属性引用,方法引用.绑定方法)

android 从 AIDL 绑定服务返回“活动”对象