可能重复:
How to make ListBox editable when bound to a List<string>?
我正在尝试在名为“ListStr”对象的List和ListBox WPF控件之间设置两个绑定。 除了我希望项目是可编辑的,所以我添加了一个带有TextBoxes的DataTemplate,期望它可以通过TextBox直接修改ListStr项目。
但是当我试图编辑其中一个时,它不起作用......
任何想法?
PS:我试图添加Mode = TwoWay参数,但它仍然无法正常工作
这是XAML:
<ListBox ItemsSource="{Binding Path=ListStr}" Style="{DynamicResource ResourceKey=stlItemTextContentListBoxEdit}" />
以下是样式代码:
<Style x:Key="stlItemTextContentListBoxEdit" TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="#FF0F2592" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Height" Value="150" />
<Setter Property="Width" Value="200" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="ItemTemplate" Value="{DynamicResource ResourceKey=dtplItemTextContentListBoxEdit}" /></Style>
DataTemplate:
<DataTemplate x:Key="dtplItemTextContentListBoxEdit">
<TextBox Text="{Binding Path=.}" Width="175" />
</DataTemplate>
答案 0 :(得分:8)
使用{Binding Path=.}
({Binding}
的长度)时双向绑定不起作用。请记住发生的事情。
ListBox
会获得一个对象列表,然后为每个项目创建一个ListBoxItem
。然后将DataContext
的{{1}}设置为该对象。当您使用ListBoxItem
时,您只想使用{Binding}
中的对象。当您键入TextBox时,它会更新什么?它无法设置DataContext,也不知道对象来自哪里(因此无法更新列表/数组)。
双向绑定确实有效,就是绑定到该对象上的属性。但是当你绑定到对象本身时却不是。
答案 1 :(得分:3)
public class ViewModel
{
ObservableCollection<TextItem> _listStr = new ObservableCollection<TextItem> { new TextItem("a"), new TextItem("b"), new TextItem("c") };
public ObservableCollection<TextItem> ListStr
{
get { return _listStr; } // Add observable and propertyChanged here also if needed
}
}
public class TextItem : NotificationObject // (NotificationObject from Prism you can just implement INotifyPropertyChanged)
{
public TextItem(string text)
{
Text = text;
}
private string _text;
public string Text
{
get { return _text; }
set
{
if (_text != value)
{
_text = value;
RaisePropertyChanged(() => Text);
}
}
}
}
XAML:
<DataTemplate>
<TextBox Text="{Binding Text}" Width="175" />
</DataTemplate>