我一直在为一个非常基本的问题而苦苦挣扎,并且想知道什么是解决该问题的最佳方法。
我有一个ExampleClass
类,它包含一个字符串列表(在这种情况下为ObservableCollection
)。
public class ExampleClass
{
public ObservableCollection<String> ColOfStrings { get; set; }
public ExampleClass()
{
ColOfStrings = new ObservableCollection<String> {"a", "b", "c"};
}
}
和一个窗口中的两个控件,这些控件绑定到此字符串列表。一个ListBox
显示元素,另一个DataGrid
编辑元素。
<Window x:Class="StringListExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:m="clr-namespace:StringListExample"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<m:MainWindowViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0"
ItemsSource="{Binding ExampleClass.ColOfStrings, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGrid ItemsSource="{Binding ExampleClass.ColOfStrings, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Grid.Column="1"
HeadersVisibility="None"
AutoGenerateColumns="False"
CanUserAddRows="True"
CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
这是ViewModel:
public class MainWindowViewModel
{
public ExampleClass ExampleClass { get; set; }
public MainWindowViewModel()
{
ExampleClass = new ExampleClass();
}
}
问题在于更改datagrid值不会更改listview的值(在这种情况下,甚至不会保存datagrid的值。如果我将DataGridTemplateColumn与TextBoxes一起使用,则会更新Textbox值)。
在此示例中,我删除了所有INotifyPropertyChanged实现,因为它们没有效果。
你们将如何处理这个问题?
提前输入任何提示!
我还试图将字符串包装到一个类中并实现INotifyPropertyChanged,这似乎对Datagrid端有效,但是要使Listbox端正常工作,我需要监视每个包装的Strings PropertyChanged Eventhandler。将字符串添加到列表将非常不方便,因为我需要调用包装构造函数并订阅事件。