将控件绑定到ComboBoxItem的属性

本文关键字:属性 ComboBoxItem 控件 绑定 | 更新日期: 2023-09-27 18:14:56

我试图有一个WPF窗口与ComboBox,与您选择一个项目,然后使用TextBoxes下面编辑当前选定的项目,如NameAge的属性。

我如何使用数据绑定做到这一点?将名称TextBox绑定到ComboBox中当前选定项的Name属性?

My XAML is

<Window x:Class="BindingTest001.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>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="10,75,0,0" TextWrapping="Wrap" Text="{Binding Path=CURR.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="497"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="10,103,0,0" TextWrapping="Wrap" Text="{Binding Path=CURR.Age, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
        <ComboBox ItemsSource="{Binding Path=MO}" SelectedValue="{Binding Path=CURR, Mode=TwoWay}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" Name="MyComboBox"/>
        <Button Content="Button" HorizontalAlignment="Left" Margin="322,181,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</Window>

后面的代码是

public partial class MainWindow : Window
{
    ObservableCollection<myObj> mo;

    public MainWindow()
    {
        InitializeComponent();
        mo = new ObservableCollection<myObj>();
        mo.Add(new myObj("Test1", 2));
        var ct  =  new MainWindowDatacontext(this);
        this.DataContext = ct;
        this.MyComboBox.SelectedIndex = 0;
    }
    private class MainWindowDatacontext : INotifyPropertyChanged
    {
        MainWindow parent;
        myObj curr;
        public MainWindowDatacontext(MainWindow mainWindow)
        {
            this.parent = mainWindow;
        }
        public ObservableCollection<myObj> MO
        {
            get
            {
                return parent.mo;
            }
        }
        public myObj CURR
        {
            get
            {
                return curr;
            }
            set
            {
                this.curr = value;
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void executePropertyChanged(string s)
        {
            if(PropertyChanged!=null)
            {
                PropertyChanged(this.parent, new PropertyChangedEventArgs(s));
            }
        }
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        mo.Add(new myObj("Test2", 10));
    }
}

但是数据绑定只适用于ComboBox - TextBoxes从不绑定到任何东西。

myObj非常简单:

public class myObj : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void propertyChanged(string s)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(s));
        }
    }

    string name;
    public string Name
    {
        get { return name; }
        set {
            name = value;
            propertyChanged("Name");
        }
    }
    int age;

    public myObj(string p1, int p2)
    {
        this.name = p1;
        this.age = p2;
    }
    public int Age
    {
        get { return age; }
        set { age = value;
        propertyChanged("Age");
        }
    }
    public override string ToString()
    {
        return String.Format("{0}, {1}", name, age);
    }
}

将控件绑定到ComboBoxItem的属性

因为您想要绑定到应用程序中另一个元素的属性,您应该使用Binding.ElementName property。所以把TextBox改成Binding,像这样:

Text="{Binding SelectedItem.Name, ElementName=MyComboBox, 
               Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
Text="{Binding SelectedItem.Age, ElementName=MyComboBox,
               Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

您在ComboBox中使用的是SelectedValue而不是SelectedItem

前者用于当您想要从ComboBox的ItemsSource对象中选择一个属性而不是对象本身时。它与SelectedValuePath一起使用。

当你想编辑所选项目的多个属性时,你需要使用SelectedItem