WPF双向数据绑定 - DataView的可编辑组合框

时间:2010-02-04 06:38:38

标签: wpf data-binding combobox two-way-binding

<ComboBox Height="23" Margin="52,64,33,0" Name="comboBox1"  
              IsSynchronizedWithCurrentItem="True"
              IsEditable="True"
              DisplayMemberPath="Value" 
              SelectedItem="{Binding Path=Number, Mode=TwoWay}"
              />

public class Number : INotifyPropertyChanged
    {
        private string value;
        public string Value
        {
            get
            {
                return value;
            }
        set
        {
            this.value = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    #endregion
}

 comboBox1.ItemsSource = new Number[] { new Number() { Value = "One" },
                                                   new Number() { Value = "Two" },
                                                   new Number() { Value = "Three" }};

我正在编辑组合框文本时,我的绑定数据集未修改。 即,没有发生源到绑定的目标。

1 个答案:

答案 0 :(得分:1)

添加Josh建议.... 首先,你应该考虑使用diff变量名称然后“value”,第二,如果值没有改变,你不应该触发“PropertyChanged”事件。

将其添加到属性setter ....

if ( value != this.value )
{

}

第三,你没有绑定到你的数据实例,你绑定到你的类类型

SelectedItem="{Binding Path=Number, Mode=TwoWay}"

第四,你应该将你的组合框中的ItemSource设置为ObservableCollection< Number >

最后,你应该看看Bea's great blog entry about debugging databinding.她有很多很好的例子。

好的,现在我可以访问我的编译器....这是你需要做的 首先,WHERE是您绑定的“Number”属性?你无法绑定回作为你的组合框源的列表。

您需要向绑定添加ElementName,或将DataContext设置为包含Number属性的对象。其次,Number属性,无论它在哪里,都需要是Notify或DependencyProperty 例如,你的Window类看起来像这样......

   public partial class Window1 : Window
   {
      public Number Number
      {
         get { return (Number)GetValue(ValueProperty); }
         set { SetValue(ValueProperty, value); }
      }

      public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(Number),typeof(Window1), new UIPropertyMetadata(null));

   }

并且你的window.xaml看起来像这样......

<Window x:Class="testapp.Window1"
          x:Name="stuff"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ComboBox Height="23" Margin="52,64,33,0" Name="comboBox1"  
              IsEditable="True"
              DisplayMemberPath="Value" 
              SelectedItem="{Binding ElementName=stuff, Path=Number, Mode=TwoWay}"
        />
    </Grid>
</Window>