【问题标题】:Silverlight Data Grid twoway Data binding in codeSilverlight Datagrid 两种方式 代码中的数据绑定
【发布时间】:2012-03-23 09:49:13
【问题描述】:

我有一个具有两种方式绑定的 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;
    } 

}

【问题讨论】:

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


    【解决方案1】:

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

    用于创建绑定的第一行是

    Binding b = new Binding("ValuesBinding");
    

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

    System.Windows.Data 错误:BindingExpression 路径错误:在 'System.Collections.ObjectModel.ObservableCollection`1 上找不到 'ValuesBinding' 属性 ...

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

    Binding b = new Binding();
    

    然后您会收到有关需要路径的双向绑定的错误。但是,这里不需要双向绑定。您可以简单地删除b.Mode = BindingMode.TwoWay; 行,错误就会消失。

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

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

    最后,我不确定您为什么要在代码隐藏中创建绑定以绑定到代码隐藏中已经可用的集合。您只需编写即可达到相同目的

    MyGrid.ItemsSource = values;
    

    【讨论】:

    • 谢谢。我想使用绑定对象的唯一原因是使用 2 方式绑定,因为这对于集合来说不是必需的,那么设置项目源是有意义的。
    猜你喜欢
    • 2011-03-06
    • 2021-03-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多