双向绑定不起作用

时间:2012-01-19 15:48:31

标签: c# wpf silverlight data-binding binding

在我的 Silverlight 项目中,我在运行时创建了双向数据绑定的文本框。在一个方向上的绑定(从源到目标)似乎工作正常,但另一个方向(从目标返回到源)没有显示任何效果

这是数据上下文:

public class Leg : INotifyPropertyChanged {

    private string passengers;

    public string Passengers {
        get { return passengers; }
        set {
            // here I have a breakpoint.
            passengers = value;
            FirePropertyChanged("Passengers"); 
         }
    }

    private void FirePropertyChanged (string property) {

        if (PropertyChanged != null) {

            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

然后在另一个地方,我正在创建一个新的TextBox控件及其绑定:

Binding passengersBinding = new Binding();

// viewModelLeg is an instance of the class Leg from above    
passengersBinding.Source = viewModelLeg;

passengersBinding.Path = new PropertyPath("Passengers");
passengersBinding.Mode = BindingMode.TwoWay;

legItem.paxTextBox.SetBinding(TextBox.TextProperty, passengersBinding);

现在,当我更改Passengers字符串的值时,绑定到它的相应文本框正在更新其文本。 所以这里很好。

但是当我手动更改文本框的文本然后使文本框失去焦点时,没有任何反应 - 即没有发生双向绑定 - 没有向下传播文本框的新文本值到来源!

我在passenger-attribute的设置者处有一个断点(用上面的断点评论标记)。 当我得到所有这一切时,绑定引擎也会在绑定的目标值更改为更新源时使用此公共setter - 所以当发生这种情况时,必须命中断点。 但是他没有!所以看来我可以用我的文本框做我想做的事情(玩焦点或按回车)它永远不会更新它的来源。

我在监督什么吗?在我的代码或我的思考中肯定存在资本错误。我会非常感谢任何想法...

修改

在下面我尝试演示如何创建我的XAML对象和我的DataContext对象。因为我在运行时创建XAML控件及其绑定,所以我找不到很好的解决方案来很好地实现MVVM方法。所以我正在做以下事情(这可能不是最好的方法):

我建模的情况是我有一个UserControl(称为LegItem),它由(主要)文本框组成。在运行时,用户可以创建尽可能多的这些userControl(一个接一个)。

在我的ViewModel端,我有一个类(称为Leg),它只用作一个LegItem的ViewModel。所以,当我说n(XAML-)LegItems时,我也有n个Leg实例。我将这些Leg对象存储在List中。

每次用户点击“添加新的一条腿”时,我都会执行以下操作。按钮:

// here we are inside the applications view in an .xaml.cs file

public void AddLeg () {

    // this is going to serve as the ViewModel for the new LegItem
    // I am about to create.
    Leg leg = viewModel.insertLeg();

    // here I am starting to create the visual LegItem. The ViewModel object
    // I have created in the previous step is getting along with.
    createLegItem(leg);
}

// the primary job here is to bind each contained textbox to its DataContext.
private LegItem createLeg (Leg viewModelLeg) {

    // create the visual leg item control element
    // which is defined as a XAML UserControl.
    LegItem legItem = new LegItem();

    Binding passengersBinding = new Binding();

    // viewModelLeg is an instance of the class Leg from above    
    passengersBinding.Source = viewModelLeg;

    passengersBinding.Path = new PropertyPath("Passengers");
    passengersBinding.Mode = BindingMode.TwoWay;

    legItem.paxTextBox.SetBinding(TextBox.TextProperty, passengersBinding);

}


// on the viewModel side there is this simple method that creates one Leg object
// for each LegItem the View is creating and stores inside a simple list.

public Leg InsertLeg () {

    Leg leg = new Leg();
    legList.add(leg)

    return leg;
}

1 个答案:

答案 0 :(得分:1)

新答案

由于您提到绑定实际上是自定义UserControl而实际上不是TextBox,我建议您查看UserControl的XAML并确保它绑定数据正确地


旧答案

我使用新的Silverlight项目进行了快速测试,发现启动项目是SilverlightApplication1.Web,而不是SilverlightApplication

这意味着当我运行项目时,setter中的断点实际上不会被击中。您会注意到断点圆就是轮廓,颜色没有填充。如果将鼠标悬停在它上面,它会说

  

断点当前不会被击中。没有加载任何符号   对于本文件

如果我启动SilverlightApplication1而不是.Web版本,则会触发断点。

无论我启动哪个版本,属性 都会正确更改,但是如果我使用.Web版本启动项目,则不会遇到断点。我怀疑这是你的问题。