C#/WPF高手进!ComboBox.ItemTemplate用TextBlock正常,用TextBox就报错!

代码见图片

你好:

一、错误原因

    TextBox绑定方式(Mode)默认为TwoWay。

    如果没有为Binding指定Path,就会使用当前源的Object.ToString()。

       在你的例子中,TextBox属性Text的值是通过Items中的每项的ToString()方法获得的;

 由于Mode=TwoWay,目标Text的值要返回给源,但能返回给Object.ToString()吗?所以出错了。

    参考:

 

二、修正方法

     Mode=OneWay

 <TextBox Text="{Binding Mode=OneWay}"/>

    指定Path

<TextBox Text="{Binding Path=.}"/>

    通过一层包装

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-14
TextBox是编辑控件,默认的绑定时twoway的双向绑定,而你数据源集合的元素是string对象,string是个特殊的对象,定义是对象,用起来确是值类型。简单的说你集合元素不能用直接用值类型来做双向绑定,比如string的绑定的时候值给了textbox,但是textbox的text要应用回数据源的时候就没有了对象引用,
string -> textbox.text 此时text是个独立的值,text和拷贝了数据源的string值,而不是引用
textbox.text ->?string 找不到对象引用了。
要使用textbox需要将items的元素用一个引用对象包装起来,顶一个class T{public string Text { get; set; }}
集合换成
public System.Collections.ObjectModel.ObservableCollection<T!这里换成T对象> Items
{
get { return (System.Collections.ObjectModel.ObservableCollection<T>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}

// Using a DependencyProperty as the backing store for Items. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(System.Collections.ObjectModel.ObservableCollection<T>), typeof(MainWindow), new PropertyMetadata(new System.Collections.ObjectModel.ObservableCollection<T>()));

初始化
Items = new System.Collections.ObjectModel.ObservableCollection<T>();
Items.Add(new T() { Text = "1" });
Items.Add(new T() { Text = "2" });
Items.Add(new T() { Text = "3" });

绑定
<TextBox Text="{Binding Text}"></TextBox>
你的明白?追问

你说的很好!但是采纳的答案格式更好。

C#\/WPF高手进!ComboBox.ItemTemplate用TextBlock正常,用TextBox就报错...
你好:一、错误原因 TextBox绑定方式(Mode)默认为TwoWay。如果没有为Binding指定Path,就会使用当前源的Object.ToString()。在你的例子中,TextBox属性Text的值是通过Items中的每项的ToString()方法获得的;由于Mode=TwoWay,目标Text的值要返回给源,但能返回给Object.ToString()吗?所以出错了。参考:...

wpf combobox自写ItemTemplate遇到的一个问题
<TextBlock Text="{Binding GoodTitle}"\/>

c# WPF listview的一列里面放着combobox 我在后台给combobox加了几个i...
combobox是否定义在template里面的,其数据源不能顺着界面绑定,需要单独定义。

C#,WPF,ListBox的选中问题。
0,2,2"><\/Image> <TextBlock VerticalAlignment="Center" Text="{Binding Name}"><\/TextBlock> <StackPanel.ToolTip> <TextBlock VerticalAlignment="Center" Text="{Binding ToolTip}" TextWrapping="Wrap" MaxWidth="200" ><\/TextBlock>...

WPF中ListBox的Item使用了StackPanel,StackPanel的长度怎么才能设置为...
<TextBlock Grid.Column="0" Margin="5,10" Text="{Binding Name}" Width="30"\/> <TextBox Grid.Column="1" Margin="0,5" Height="24" Text="{Binding Text}"\/> <ComboBox Grid.Column="2" Margin="0,5" Height="24" ItemsSource="{Binding Combo}"\/> <\/Grid> <\/DataTemplate>...

WPF 自定义的ComboBox 给定了ItemsSource和SelectedItem 但是SelectedInd...
应该是和SelectedItem冲突了,可以改Text属性为默认值试试。

c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值...
你的需求是模板列里修改单元格的值,更新另一个单元的值。还是拿student举例。例如我们的name要求根据id+1,而id值是可以在前台修改的值。它放在模板列里的textbox供我们去修改。(前台修改导致后台数据更新的话就涉及到双向绑定,不懂的话自己先去网上查查相关资料)那我们就可以通过Textbox的TextChanged...

相似回答