[英]GridViewColumn.CellTemplate with TextBox not working with ListView.ItemContainerStyle
[英]Bind Textbox to Listview GridViewColumn
我想將單個文本框綁定到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.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。
我也想使用組合框。 請幫忙 :)
您將綁定到string
並且由於String
類未實現INotifyPropertyChanged
接口,因此將不會更新目標屬性(列)。
應該綁定到實現INotifyPropertyChanged
接口的類的屬性,而不是綁定到string
數組中的項目( Value[0]
和Value[1]
)。
因此,將Values
屬性的類型從string[]
更改為具有兩個引發更改通知並綁定到這些屬性而不是綁定到string
數組的屬性的類型。
一些東西..
您正在更新集合中的字符串,因此需要在集合項上實現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}"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.