日期:2014-05-17  浏览次数:20840 次

WPF,请看下这个数据绑定

<Window.DataContext>
    <local:Person />
</Window.DataContext>
<Grid HorizontalAlignment="Left" Height="519" VerticalAlignment="Top" Width="927">
    <ListBox Name="listbox1" ItemsSource="{Binding list}" SelectedItem="{Binding SelectString}" HorizontalAlignment="Left" Height="182" Margin="114,63,0,0" VerticalAlignment="Top" Width="124"/>
    <TextBox Text="{Binding ElementName=listbox1, Path=SelectedItem}" HorizontalAlignment="Left" Height="24" Margin="305,154,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
</Grid>



class Person
{
    public List<string> list { get; set; }
    public string SelectString { get; set; }
    public Person()
    {
        list = new List<string>() { "aa", "bb", "cc" };
        SelectString = "";
    }
}



上面代码中个,listbox绑定到Person类的list属性,正常显示了数据。不过,SelectedItem是绑定到Person类的SelectString属性上的,TextBox又是绑定到SelectedItem的。SelectString属性一直都是空字符串,绑定类型也是单向绑定,
所以,SelectedItem也应该一直是空字符串吧,所以,就应该一直没有选中项的吧,为什么TextBox却显示了的呢?

------解决方案--------------------
如果没有匹配的值,那么SelectItem不会改变选中项目。


------解决方案--------------------
SelectedItem绑定了SelectString, 默认的是双向绑定。你可以通过改变SelecteString来改变ListBox中的SelectedItem(但你这里要重新打开才能看到,因为你没有继承Inotifypropertychaged接口),也可以通过点击ListBox中的选项来更新SelecteString. 所以,并不是说你设置好SelecteString后,就没有办法在ListBox中点击选项了。

理解了上面一点,你的textbox绑定到SelectedItem就没什么问题了,selectedItem改变后,textbox内容会跟着变。


------解决方案--------------------
引用:
Quote: 引用:

SelectedItem默认是双向绑定吗?我目前只知道TextBox的Text属性和CheckBox的IsChecked属性是双向的,请问还有哪些是默认双向的呢?请举几个例子


这个也是根据情况来的。
一般允许修改的属性都是默认双向绑定的,比如你提到的textbox.
如果只读的话,那默认就是单向绑定的,比如TextBlcok.