我希望将单个文本框绑定到gridviewcolumn中找到的值。 但是,在编辑文本框时,我希望它还可以编辑和更新我选择的网格视图列行。
XAML
<ListView x:Name="ExampleLV" ItemsSource="{Binding Data.Collection}">
<ListView.View>
<GridView>
<GridViewColumn Header="ColumnName1" DisplayMemberBinding="{Binding Value[0], Mode=TwoWay}"/>
<GridViewColumn Header="ColumnName2" DisplayMemberBinding="{Binding Value[1], Mode=TwoWay}"/>
</GridView>
</ListView.View>
</ListView>
<TextBox Name="ExampleTB1" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[0]}"/>
<TextBox Name="ExampleTB2" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[1]}"/>
C# - Collection被映射到字符串数组
Collection.Add(new ListViewItem() { Values = new string[] { "abc", "123" } });
ListViewItem是我构建的自定义类。
public class ListViewItem : INotifyPropertyChanged
{
private string[] _values;
#region Properties
public string[] Values
{
get { return _values; }
set
{
if (value == _values) return;
_values = value;
OnPropertyChanged();
}
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;//[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我遇到的问题是正在为文本框更新值,但它们不会更新listviewItem。但是,存储的值只是更新GridViewColumn。
我也希望使用组合框。请帮忙:)
答案 0 :(得分:1)
您绑定到string
,并且由于String
类未实现INotifyPropertyChanged
接口,因此不会更新目标属性(列)。
您应该绑定到实现string
接口的类的属性,而不是绑定到Value[0]
数组(Value[1]
和INotifyPropertyChanged
)中的项。
因此,将Values
属性的类型从string[]
更改为具有两个属性的类型,这两个属性会引发更改通知并绑定到这些属性,而不是绑定到string
数组。
答案 1 :(得分:1)
一些事情..
您正在更新集合中的字符串,因此您需要对集合项实施INotify。
类似的东西:
public class ValueViewModel : INotifyPropertyChanged
{
private string _value;
public string Value
{
get { return _values; }
set
{
if (_value == value) return;
_value = value;
OnPropertyChanged();
}
}
}
更新ListViewItem ViewModel以使用新的ValueViewModel类型。
public class ListViewItem : INotifyPropertyChanged
{
private ValueViewModel[] _values;
#region Properties
public ValueViewModel[] Values
{
get { return _values; }
set
{
if (value == _values) return;
_values = value;
OnPropertyChanged();
}
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;//[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
最后,更新您的绑定:
<ListView x:Name="ExampleLV" ItemsSource="{Binding Data.Collection}">
<ListView.View>
<GridView>
<GridViewColumn Header="ColumnName1" DisplayMemberBinding="{Binding Value[0].Value, Mode=TwoWay}"/>
<GridViewColumn Header="ColumnName2" DisplayMemberBinding="{Binding Value[1].Value, Mode=TwoWay}"/>
</GridView>
</ListView.View> </ListView>
<TextBox Name="ExampleTB1" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[0].Value}"/> <TextBox Name="ExampleTB2" Text="{Binding ElementName=ExampleLV, Path=SelectedItem.Values[1].Value}"/>