我有一个WPF应用程序(MVVM模式),带有数据绑定到字符串和字符串列表:
public string Property
{
get { return _model.property; }
set
{
if (value == _model.property)
{
return;
}
_model.property= value;
base.NotifyPropertyChanged();
}
}
public List<string> PropertyList
{
get { return _model.PropertyList; }
set
{
if (value == _model.PropertyList)
{
return;
}
_model.PropertyList= value;
base.NotifyPropertyChanged();
}
}
我的绑定看起来像这样:
<TextBox Text="{Binding Path=Property,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
>
<TextBox Text="{Binding Path=PropertyList[0],
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
>
看起来很好,对吧? 但是当我调试它并将断点设置为setter和getter时,将永远不会调用PropertyList setter。但是,PropertyList项0的值具有新值。
那么列表或一个项目的绑定是如何工作的呢?
答案 0 :(得分:0)
列表在内容更改时不会发出GUI信号,因此您应始终绑定到WPF中的 ObservableCollections ,这样可以毫不费力地为您完成。
问题很可能是你的_model.PropertyList更新,一种处理它的方法,如果两者都使用OC&#39;
选项1
public ObservableCollection<String> PropertyList
{
get { return propertyList; }
set
{
if (Equals(value, propertyList)) return;
propertyList = value;
propertyList.CollectionChanged += propertyList_CollectionChanged; // I Hate this
OnPropertyChanged("PropertyList");
}
}
void propertyList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged("PropertyList"); // when the collection changes signal gui
}
选项2
我会这样做(假设我理解你想要的东西),只需将此类用作视图的datacontext。 我怀疑这是你定义为_model的?
public class YourViewModel : INotifyPropertyChanged // your ViewModelBase goes here :)
{
private ObservableCollection<string> propertyList = new ObservableCollection<string>();
private string property;
public ObservableCollection<String> PropertyList
{
get { return propertyList; }
set
{
if (Equals(value, propertyList)) return;
propertyList = value;
OnPropertyChanged("PropertyList");
}
}
public String Property
{
get { return property; }
set
{
if (value == property) return;
property = value;
OnPropertyChanged("Property");
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator] // Comment out if no R#
protected virtual void OnPropertyChanged(string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
但是为什么你绑定到列表中的第一项?列表的重点是什么? 通常,您将PropertyList绑定到项控件,并将Property绑定为具有双向绑定的SelectedItem。然后,您可以将文本框绑定到此SelectedItem以进行编辑/显示。
IE(非常简单)
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListBox Grid.Row="0" ItemsSource="{Binding PropertyList}" SelectedItem="{Binding Path=Property, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Grid.Row="1" Text="{Binding Path=Property, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
希望它有所帮助,
干杯
了Stian