1

双方向バインディングのDataGridがありますが、これが機能しない理由がわかりません。助けていただければ幸いです。

双方向バインディングオブジェクトを使用して、DataGridに動的にバインドしたかったのです。

XAMLの列を使用しました。'ItemSource"プロパティを直接設定した場合(機能しますが、2つのバインディングは機能しません)、コードでソースを変更すると、グリッドはその変更を反映しません。

セットアップを説明するための簡単なサンプルを作成しました

これが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;
    } 

}
4

1 に答える 1

1

私がここで見ることができるいくつかの問題があります。

バインディングを作成するために使用する最初の行は

Binding b = new Binding("ValuesBinding");

これはあなたが望むことをしません。文字列ValuesBindingはプロパティパスとして使用されており、DataGridをバインドしているObservableCollectionには、という名前のプロパティがありませんValuesBinding。実際、VS出力ウィンドウを見ると、次のようなメッセージが表示されるはずです。

System.Windows.Dataエラー:BindingExpressionパスエラー:'ValuesBinding'プロパティが'System.Collections.ObjectModel.ObservableCollection`1に見つかりません...

"ValuesBinding"ただし、上記から削除してそのままにしておくと

Binding b = new Binding();

次に、パスを必要とする双方向バインディングに関するエラーが発生します。ただし、ここでは双方向のバインディングは必要ありません。行を削除するだけb.Mode = BindingMode.TwoWay;で、エラーはなくなります。

双方向バインディングは、ビューレイヤーがビューモデルレイヤーにプロパティを設定できるようにするために使用されます。パスは、設定するビューモデルプロパティの場所を指定します。ただし、コレクションに直接バインドしているため、関連するプロパティはなく、ビューレイヤーが設定できるものはありません。

あなたの場合、このバインディングは双方向である必要はありません。ItemsSourceに一方向バインディングを使用している場合でも、コレクション自体に変更(アイテムの追加や削除など)を行うことができます。LabelクラスのプロパティとYValueプロパティに対する双方向バインディングValueも、期待どおりに機能します。DataGridのItemsSourceに一方向バインディングを設定しても、グリッド全体が読み取り専用になるわけではありません。

最後に、コードビハインドで既に使用可能なコレクションにバインドするために、コードビハインドでバインディングを作成している理由がわかりません。あなたは書くだけで同じことを達成することができます

MyGrid.ItemsSource = values;
于 2012-03-05T23:31:46.950 に答える