Silverlight Datagrid双向数据绑定代码

时间:2012-03-05 22:12:47

标签: silverlight data-binding datagrid two-way-binding

我有一个具有双向绑定的DataGrid,并且不确定为什么这不起作用,任何帮助都将不胜感激。

我想使用双向绑定对象动态绑定到DataGrid。

我使用了XAML中的列。如果我只是直接设置'ItemSource'属性 - 它可以工作,但是这两个绑定不起作用 - 如果我在代码中更改我的源代码,Grid就不会反映这种变化。

我创建了一个简单的示例来说明我的设置

这是XAML

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="356" d:DesignWidth="590" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <Grid x:Name="LayoutRoot" Background="White"> 
        <sdk:DataGrid AutoGenerateColumns="False" Height="136" HorizontalAlignment="Left" Margin="71,116,0,0" Name="MyGrid" VerticalAlignment="Top" Width="453" >
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Binding="{Binding Path=Label, Mode=TwoWay}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto" Header="Selected" />
                <sdk:DataGridTextColumn Binding="{Binding Path=YValue, Mode=TwoWay}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Name" Width="*" />
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>
    </Grid>
</UserControl>

以下是

背后的代码
namespace SilverlightApplication1
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent(); 
            ObservableCollection<Value> values = new ObservableCollection<Value>(); 
            values.Add(new Value() { Label = "Sony", YValue = 50 });
            values.Add(new Value() { Label = "Dell", YValue = 35 });
            values.Add(new Value() { Label = "HP", YValue = 27 });
            values.Add(new Value() { Label = "HCL", YValue = 17 });
            values.Add(new Value() { Label = "Toshiba", YValue = 16 });

            PagedCollectionView p = new PagedCollectionView(values); 

            Binding b = new Binding("ValuesBinding");
            b.Mode = BindingMode.TwoWay;
            b.Source = values;
            MyGrid.SetBinding(DataGrid.ItemsSourceProperty, b);  
        }
    }

    public class Value : INotifyPropertyChanged
    {
        public String Label
        {
            get
            { return _label; }
            set
            {
                _label = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Label"));
            }
        }
         public Double YValue
        {
            get
            {return _yValue;}
            set
            {
                _yValue = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("YValue"));
            }
        }
        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
        Double _yValue;
        String _label;
    } 

}

1 个答案:

答案 0 :(得分:1)

我可以在这里看到几个问题。

用于创建绑定的第一行是

Binding b = new Binding("ValuesBinding");

这不会做你想要的。字符串ValuesBinding用作属性路径,而您绑定DataGrid的ObservableCollection在其上没有名为ValuesBinding的属性。实际上,如果查看VS Output窗口,您应该会看到一条消息,例如

System.Windows.Data Error: BindingExpression path error: 'ValuesBinding' property not found on 'System.Collections.ObjectModel.ObservableCollection`1 ...

但是,如果您从上面删除"ValuesBinding"以便

Binding b = new Binding();

然后你得到一个关于需要Path的双向绑定的错误。但是,您不需要双向绑定。您只需删除行b.Mode = BindingMode.TwoWay;即可消除错误。

双向绑定用于允许视图层在视图模型层中设置属性。 Path指定在何处查找要设置的视图模型属性。但是,由于您直接绑定到集合,因此不涉及任何属性,因此视图层无法设置任何属性。

在您的情况下,此绑定不需要是双向的。即使对ItemsSource使用单向绑定,仍然可以对集合本身进行更改(例如,添加或删除项目)。您对Label类的YValueValue属性的双向绑定也可以按预期工作。在DataGrid的ItemsSource上设置单向绑定不会使整个网格成为只读。

最后,我不确定为什么要在代码隐藏中创建绑定以绑定到代码隐藏中已有的集合。只需编写

即可实现相同目的
MyGrid.ItemsSource = values;