请教一下 wpf绑定问题

晚安苏州 2016-10-18 12:56:41
我在界面上放了一个combobox,一个textbox:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Loaded="page_loaded"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel x:Name="panel_1" Grid.Row="0" Height="auto">
<ComboBox x:Name="comboBox" Grid.Row="0" ItemsSource="{Binding StudyList}"
DisplayMemberPath="Name" SelectedValuePath="Name" SelectedItem="{Binding SelectedStudy,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Top" Width="120"/>
<Button x:Name="button1" Content="动态增加textbox" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Top" Width="75" Click="button_Click" />
</StackPanel>

<StackPanel x:Name="panel_2" Grid.Row="1">
<TextBlock>下面是2个TextBox</TextBlock>
<TextBox Text="{Binding SelectedStudy.Name}" ></TextBox>
</StackPanel>

</Grid>
</Window>



其中textbox绑定的是combobox选定项的一个属性:Name

还有一个按钮作用是:动态增加一个textbox,text值同样是绑定combobox选定项的这个属性:Name


using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;


namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window,INotifyPropertyChanged
{
private ObservableCollection<Study> studyList= new ObservableCollection<Study>();
public ObservableCollection<Study> StudyList
{
get
{
return studyList;
}

set
{
studyList = value;
}
}

private Study selectedStudy = new Study();

public Study SelectedStudy
{
get
{
return selectedStudy;
}

set
{
selectedStudy = value;
if (PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("SelectedStudy"));
}
}
}

public MainWindow()
{
InitializeComponent();
}

public event PropertyChangedEventHandler PropertyChanged;

private void button_Click(object sender, RoutedEventArgs e)
{
TextBox t = new TextBox();
t.Margin = new Thickness(3);
t.Text = "this is my text";
this.panel_2.Children.Add(t);
this.panel_2.RegisterName("mytext1", t);

t.SetBinding(TextBox.TextProperty, new Binding("Name") {
Source= StudyList,
Mode= BindingMode.TwoWay,
UpdateSourceTrigger= UpdateSourceTrigger.PropertyChanged

});
}

private void page_loaded(object sender, RoutedEventArgs e)
{
StudyList.Add(new Study() { Selected = true, Age = 20, Name = "Tom" });
StudyList.Add(new Study() { Selected = true, Age = 22, Name = "Jack" });
StudyList.Add(new Study() { Selected = true, Age = 23, Name = "Jimi" });
StudyList.Add(new Study() { Selected = true, Age = 24, Name = "Cat" });
}
}
}




public class Study: INotifyPropertyChanged
{
private string name;
private int age;
private bool selected;

public event PropertyChangedEventHandler PropertyChanged;

public string Name
{
get
{
return name;
}

set
{
name = value;
if (null != PropertyChanged)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
}

public int Age
{
get
{
return age;
}

set
{
age = value;
if (null != PropertyChanged)
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Age"));

}
}

public bool Selected
{
get
{
return selected;
}

set
{
selected = value;

if (null != PropertyChanged)
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Selected"));

}
}
}


现在的问题是,第一个textbox是可以随着combobox的选择改变而改变,而动态增加的这个textbox就不行。

然后我把动态textbox的绑定写成这样:

t.SetBinding(TextBox.TextProperty, new Binding("SelectedStudy.Name") {
Source= this,
Mode= BindingMode.TwoWay,
UpdateSourceTrigger= UpdateSourceTrigger.PropertyChanged
});


就能达到和第一个textbox一样的绑定效果,这是为什么呢?难道下面这种写法不对么?


t.SetBinding(TextBox.TextProperty, new Binding("Name") {
Source= SelectedStudy,
Mode= BindingMode.TwoWay,
UpdateSourceTrigger= UpdateSourceTrigger.PropertyChanged
});


有没有大神们给我讲解一下这里面的套路?
...全文
984 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
exception92 2016-10-18
  • 打赏
  • 举报
回复
完全可以在 后台构造函数中 设置 this.DataContext = this. 进而在xaml中 将设置DataContext的部分删掉。
exception92 2016-10-18
  • 打赏
  • 举报
回复
那样写的话 textbox的source 是个集合,textbox就不知道要显示集合中的那个name。 动态增加一个textbox,text值同样是绑定combobox选定项的这个属性:Name -》你是根据combobox的选择项 进行textbox的添加的, 当然要限定一下 textbox的source,以及text对应的name 为当前选择的SelectedItem
晚安苏州 2016-10-18
  • 打赏
  • 举报
回复

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧