C#:将TextBox绑定到SelectedValue

时间:2009-11-19 04:34:33

标签: c# .net data-binding list listbox

我有一个List<>我绑定到ListBox的对象。然后我想将SelectedValue的属性绑定到各种TextBoxes。但这种行为非常棘手。

当绑定用作ListBox的DisplayMember的Name(字符串)时,它不会更新ListBox,如果我尝试刷新TextChanged事件的绑定,则在选择更改之前它不会更新然后在切换选择时遇到问题。

当绑定Balance(十进制)时,它会更改所有这些(或者,当我更改选择时,可能会应用更改,但实际上它正在更改数据,而不仅仅是更新)。

要清楚,我使用的是C#.NET,而不是ASP。

2 个答案:

答案 0 :(得分:1)

假设WPF,快速示例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <ListBox x:Name="list" 
                 ItemsSource="{Binding}"
                 DisplayMemberPath="Name"/>
        <TextBox Text="{Binding ElementName=list, Path=SelectedItem.Name}"
                 Grid.Row="1"/>
        <TextBox Text="{Binding ElementName=list, Path=SelectedItem.Val}"
                 Grid.Row="2" />
    </Grid>
</Window>

namespace WpfApplication1 {
    public class Thing : INotifyPropertyChanged {
        private string _name;
        private double _val;

        public string Name {
            get { return _name; }
            set {
                _name = value;
                OnPropertyChanged("Name");
            }
        }

        public double Val {
            get { return _val; }
            set {
                _val = value;
                OnPropertyChanged("Val");
            }
        }

        protected void OnPropertyChanged(string propertyName) {
            PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if (propertyChanged != null) {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();

            DataContext = new List<Thing> { new Thing { Name = "A", Val = 1.0 }, new Thing { Name = "B", Val = 2.0 } };
        }
    }
}

答案 1 :(得分:0)

我在Switch on the Code找到了解决方案。基本上,我需要使用BindingList集合而不仅仅是List。