2017-03-16 75 views
1

我正在寻找将单个文本框绑定到在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。

我也希望这个工作与组合框。请帮助:)

回答

1

有几件事情..

要更新的集合中的字符串,所以你需要实现对藏品的inotify。

喜欢的东西:

public class ValueViewModel : INotifyPropertyChanged 
{ 
    private string _value; 

    public string Value 
    { 
     get { return _values; } 
     set 
     { 
      if (_value == value) return; 

      _value = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

更新您的ListViewItem视图模型使用新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}"/> 
+0

是的,感谢@ mm8我实现了这一点,它有意义,但它仍然不能实时匹配值。只在项目点击。 –

+0

我应该更清楚,它现在正在更新,但重点退出。是否有可能在按键上更新? –

+1

编辑:UpdateSourceTrigger = PropertyChanged解决了这个问题。谢谢! –

1

您绑定到string并且由于String类未实现接口INotifyPropertyChanged目标属性(列)将不会更新。

代替在string阵列(Value[0]Value[1])结合到一个物体,您应绑定到实现INotifyPropertyChanged接口的类的属性。

因此,将Values属性的类型从string[]更改为具有两个属性的类型,这两个属性引发更改通知并绑定到这些属性,而不是绑定到string数组。

+0

谢谢!我认为我们正走在正确的轨道上! –