2

ViewModelによってデータグリッドのSelectedValueを変更する方法は誰でも知っています。Viewを変更すると、VMが起動しますが、その逆はありません。

4

3 に答える 3

3
 public ViewModel()
    {
        PriceLogs = new ObservableCollection<PriceLog>();

        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(2), Price = 200 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(20), Price = 200 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(50), Price = 200 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(80), Price = 600 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(80), Price = 300 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(2), Price = 200 });
        //Here is how you can change selected Item from ViewModel
        SelectedPriceProlog = PriceLogs.Last();
       // SelectedPriceProlog = PriceLogs[2];
  }
    public ObservableCollection<PriceLog> PriceLogs { get; set; }

    private PriceLog selectedPriceProlog;
    public PriceLog SelectedPriceProlog 
    {
        get { return selectedPriceProlog; }

        set
        {
            selectedPriceProlog = value;
            Notify("SelectedPriceProlog");
        }
    }

<DataGrid ItemsSource="{Binding PriceLogs}" SelectedItem="{Binding SelectedPriceProlog, Mode=TwoWay}">

選択値の設定方法

    public ViewModel()
    {
        PriceLogs = new ObservableCollection<PriceLog>();

        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(2), Price = 200 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(20), Price = 200 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(50), Price = 200 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(80), Price = 600 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(80), Price = 900 });
        PriceLogs.Add(new PriceLog() { LogDateTime = DateTime.Now.AddDays(2), Price = 200 });
        //Here is how you can change selected value from ViewModel
        SelectedPrice = 900;
       // SelectedPriceProlog = PriceLogs[2];

        //Or ypu can set 
  }
    public ObservableCollection<PriceLog> PriceLogs { get; set; }


    private int selectedPrice ;
    public int SelectedPrice 
    {
        get { return SelectedPrice ; }

        set
        {
            selectedPrice = value;
            Notify("SelectedPriceProlog");
        }
    }

 <DataGrid ItemsSource="{Binding PriceLogs}" SelectedValue="{Binding SelectedPrice, Mode=TwoWay}" SelectedValuePath="Price">

DataGrid の SelectedItem プロパティを ViewModel プロパティにバインドすることで実行できます。このプロパティは、DataGrids ItemSource とバインディングが TwoWay である必要があるタイプである必要があり、VewModel でそのプロパティをコレクションの任意の項目に設定できます。または、それを実行できます。上記のように SelectedValue を使用します。View から ViewModel Only に変更する場合は、バインド モードを OneWay にする必要があります。これが役立つことを願っています。

于 2013-01-20T07:43:37.550 に答える
0

2 つの解決策があります。

  • DataGrids のコレクションのアイテムとして立つ各 VM は、IsSelectedプロパティを実装できます。次に、バインディングを調整し、親 VM にそのプロパティを更新するよう通知するSelectedItemか、 SelectedItems
  • 項目のプロパティSelectedItemsを宣言する必要なく、双方向 (VM -> V および V -> VM) で作業したかったのです。いくつかの添付プロパティを持つ静的クラス SelectionHelper をコーディングしました。これらのプロパティの 1 つは項目のコレクションを受け入れ、DataGrid.SelectedItems をそれと同期させます。したがって、VM からの選択を制御できます。別のプロパティのタイプは です。また、このコマンドは、ユーザーの操作によって選択が変更されるたびに実行されます。コマンドのパラメーターは DataGrid.SelectedItems コレクションです。今度は、コマンドを実行する代わりに、バインドされたコレクションの直接操作のサポートを計画しました。IsSelected

    ICommand

必要であれば、明日オフィスに来たらコードを共有できます。

于 2013-01-20T09:58:48.113 に答える
0

ViewModel を更新する DataBinding を探していますが、その逆ではないため、OneWayToSourceexと呼ばれる DataBinding モードがあります。
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource}"/>

于 2013-01-20T07:21:12.430 に答える