嵌套用户控件绑定对嵌套属性不起作用

本文关键字:嵌套 属性 不起作用 绑定 用户 控件 | 更新日期: 2023-09-27 17:49:42

我在c# win应用程序中有三个usercontrol;主用户名为UcReferenteTecnico,它只包含有嵌套用户控件UcIndirizzo的UcContatto。UcContatto有一个名为ContattoMV的模型视图UcIndirizzo有一个名为IndirizzoMV的模型视图

UcContatto modelview有一个属性和一个嵌套的IndirizzoMV属性;它们是这样完成的:

public class ContattoMV:INotifyPropertyChanged
{
    string _NOME_CONTATTO;
    [HeaderAttribute("Nome contatto", true, 2)]
    public string NOME_CONTATTO
    {
        get { return _NOME_CONTATTO; }
        set
        {
            _NOME_CONTATTO = value;
            NotifyPropertyChanged("NOME_CONTATTO");
        }
    }
    public IndirizzoMV Indirizzo
    {
        get { return _Indirizzo; }
        set
        {
            _Indirizzo = value;
            NotifyPropertyChanged("Indirizzo");
        }
    }
    public void NotifyPropertyChanged(string aiPropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(aiPropertyName));
        }
    }
}
public class IndirizzoMV:INotifyPropertyChanged
{
    public string TOPONIMO
    {
        get { return _TOPONIMO; }
        set
        {
            _TOPONIMO = value;
            NotifyPropertyChanged("TOPONIMO");
        }
    }
    public void NotifyPropertyChanged(string aiPropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(aiPropertyName));
        }
    }
}

在UcContatto和UcIndirizzo中,所有属性都以这种方式绑定到Control:In UcContatto:

this.txtNome.DataBindings.Add(new System.Windows.Forms.Binding("EditValue", this._bsContatto, "NOME_CONTATTO", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

和绑定嵌套usercontrol UcIndirizzo这样做:

this.ucIndirizzo1.DataBindings.Add(new System.Windows.Forms.Binding("BsIndirizzo", this._bsContatto, "Indirizzo", true));

其中_bsContatto是typeof ContattoMV, BsIndirizzo是这样完成的可绑定属性:

[Bindable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public IndirizzoMV BsIndirizzo
{
    get
    {
        return (IndirizzoMV)_bsIndirizzo.DataSource;
    }
    set
    {
        if (value == null)
        {
            return;
        }
        _bsIndirizzo.DataSource = value;
    }
}

在UcIndirizzo属性中是这样绑定的:

this.txtToponimo.DataBindings.Add(new System.Windows.Forms.Binding("EditValue", this._bsIndirizzo, "TOPONIMO", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

其中_bsIndirizzo是IndirizzoMV的类型。在UcContatto中,将属性扩展到主UserControl,我使用另一个可绑定的属性,如下所示:

[Bindable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ContattoMV BsContatto
{
    get
    {
        return (ContattoMV)_bsContatto.DataSource;
    }
    set
    {
        if (value == null)
        {
            return;
        }
        _bsContatto.DataSource = value;
    }
}

在主控件UcReferenteTecnico中初始化usercontrol:

this.ucContatto1.BsContatto = new ContattoMV();

当我改变值在我的用户控制,如果我设置值在txtNome, NOME_CONTATTO属性值(在断点输入设置属性)如果我在txtToponimo中更改ucIndirizzo中的值,则没有属性值

我的错误在哪里?谢谢大家

嵌套用户控件绑定对嵌套属性不起作用

我想说你的错误是不使用XAML来定义你的Binding s,但我猜你可能有一些有效的理由。由于所有的外部类型和属性名称,我发现很难遵循您的问题,所以虽然我认为我不能直接帮助解决您的问题,但我可以提供这个简单的建议:

当您想要数据绑定到父视图模型中的属性时,您可以简单地使用RelativeSource Binding:

假设这是在父视图模型中:

public string NOME_CONTATTO
{
    get { return _NOME_CONTATTO; }
    set
    {
        _NOME_CONTATTO = value;
        NotifyPropertyChanged("NOME_CONTATTO");
    }
}

你可以直接从任何子视图绑定到它,像这样:

<TextBox Text="{Binding DataContext.NOME_CONTATTO, 
    RelativeSource={RelativeSource AncestorType={x:Type Local:ParentView}}}" ... />

或者,如果你只是想在视图模型之间传递一些值,你可以使用delegate…看到我的回答如何从其他视图模型调用主视图模型中的函数?问题,看看怎么做