使用字符串列表和数据绑定的最佳方法

时间:2018-07-18 11:06:20

标签: c# wpf mvvm data-binding

我一直在为一个非常基本的问题而苦苦挣扎,并且想知道什么是解决该问题的最佳方法。

我有一个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。将字符串添加到列表将非常不方便,因为我需要调用包装构造函数并订阅事件。

0 个答案:

没有答案