DataGrid中的WPF ComboBox数据绑定/更新无法正常工作

MRo*_*Roc 7 .net data-binding wpf datagrid combobox

如果我在Visual Studio 2010中设置新的WPF应用程序并添加以下代码+ XAML,则会打开一个数据网格,其中包含组合框.现在的问题是通过组合框更改值不会传播到绑定数据模型.换句话说:名为MyValue的属性永远不会被设置.现在花了我几个小时,我不知道为什么这不起作用.许多类似的线程和建议也没有.

这里是XAML.它只是一个包含DataGrid的简单窗口.DataGrid有一个模板列,其中设置了CellTemplate和CellEditingTemplate.两者都包含一个ComboBox,其中填充了资源部分中的列表.ComboBox.SelectedItem绑定到MyItem.MyValue:

<Window x:Class="DataGridComboBoxExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"    xmlns:local="clr-namespace:DataGridComboBoxExample">

    <Window.Resources>

        <local:MyItemList x:Key="ItemList"/>

        <DataTemplate x:Key="NotificationModeDataTemplate">
            <ComboBox
                ItemsSource="{StaticResource ItemList}"
                SelectedItem="{Binding Path=MyValue, Mode=OneWay}" />
        </DataTemplate>
        <DataTemplate x:Key="NotificationModeEditTemplate">
            <ComboBox
                ItemsSource="{StaticResource ItemList}"
                SelectedItem="{Binding Path=MyValue, Mode=TwoWay}" />
        </DataTemplate>

    </Window.Resources>

    <Grid>
        <DataGrid x:Name="myDataGrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn
                    Header="Test" Width="100"
                    CellTemplate="{StaticResource NotificationModeDataTemplate}"
                    CellEditingTemplate="{StaticResource NotificationModeEditTemplate}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

这里的代码.它包含主窗口ctor,它只是设置一个DataContext.MyItem是支持INotifyPropertyChanged的行的数据模型.MyItemList是绑定到ComboBox.ItemsSource的选项列表.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        myDataGrid.ItemsSource = new List<MyItem> 
        {
            new MyItem { MyValue = "i0" },
            new MyItem { MyValue = "i1" },
            new MyItem { MyValue = "i0" },
        };
    }
}

public class MyItem : INotifyPropertyChanged
{
    public string MyValue
    {
        get { return myValue; }
        set
        {
            myValue = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyValue"));
            }
        }
    }
    private string myValue;

    public event PropertyChangedEventHandler PropertyChanged;
}

public class MyItemList : List<string>
{
    public MyItemList() { Add("i0"); Add("i1"); Add("i2"); }
}
Run Code Online (Sandbox Code Playgroud)

小智 14

我怀疑你需要让SelectedItem绑定更新PropertyChanged上的源才能使其正常工作.

SelectedItem ="{Binding Path = MyValue,Mode = TwoWay,UpdateSourceTrigger = PropertyChanged }"

我将使CellTemplate和CellEditingTemplate在调试时引用您的编辑模板,以消除其他不相关的模板,直到您将其整理出来.

  • 为什么这实际上有效?如果我将相同的 `ComboBox` 移到 DataGrid 之外(仅移动到一个列表中),那么对于同一个视图模型来说就不需要了。 (3认同)