嵌套的用户控件绑定不适用于嵌套属性

时间:2015-05-18 11:20:02

标签: c# data-binding

我在C#win应用程序中有三个usercontrol;主用户名为UcReferenteTecnico,仅包含具有嵌套用户控件UcIndirizzo的UcContatto。 UcContatto有一个名为ContattoMV的modelView,而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以这种方式: 在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是ContoftoMV的类型,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();

当我在我的usercontrol中更改值时,如果我在txtNome中设置了值,则会对NOME_CONTATTO属性进行估值(输入设置属性中的断点) 如果我在txtToponimo中更改ucIndirizzo中的值,则不会重视属性

我的错误在哪里? 非常感谢

1 个答案:

答案 0 :(得分:0)

我说你的错误没有使用XAML定义你的Binding ,但我想你可能有一些正当理由。我发现由于所有外国类型和属性名称都很难关注你的问题,所以虽然我不认为我可以直接解决你的问题,但我可以提供这个简单的建议:

如果要将数据绑定到父视图模型中的属性,只需使用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 s ...查看我对How to call functions in a main view model from other view models?问题的回答,以了解如何执行此操作。