C# 将文本框绑定到Listview GridViewColumn
我希望将单个文本框绑定到gridviewcolumn中的值。 但是,在编辑文本框时,我希望它也编辑和更新我选择的网格视图列行 XAML ListViewItem是我构建的自定义类C# 将文本框绑定到Listview GridViewColumn,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,我希望将单个文本框绑定到gridviewcolumn中的值。 但是,在编辑文本框时,我希望它也编辑和更新我选择的网格视图列行 XAML ListViewItem是我构建的自定义类 public class ListViewItem : INotifyPropertyChanged { private string[] _values; #region Properties public string[] Values {
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
我也希望这与一个组合框工作。请帮助:)您正在绑定到
字符串
,并且由于字符串
类未实现INotifyPropertyChanged
接口,因此目标属性(列)将不会更新
您不应该绑定到字符串数组(Value[0]
和Value[1]
)中的项,而应该绑定到实现INotifyPropertyChanged
接口的类的属性
因此,将值
属性的类型从字符串[]
更改为具有两个属性的类型,这两个属性会引发更改通知并绑定到这些属性,而不是绑定到字符串
数组。
您正在更新集合中的字符串,因此需要对集合项实现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}"/>
yes,多亏了@mm8,我实现了这一点,这很有意义,但它仍然无法实时匹配这些值。只有在项目点击。我应该更清楚,它现在正在更新,但焦点退出。是否可以改为在按键时更新?编辑:UpdateSourceTrigger=PropertyChanged可解决此问题。谢谢是的,默认情况下,文本框控件仅在失去焦点时更新。很高兴你成功了!
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}"/>