ViewModelによってデータグリッドのSelectedValueを変更する方法は誰でも知っています。Viewを変更すると、VMが起動しますが、その逆はありません。
3380 次
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 を探していますが、その逆ではないため、OneWayToSource
exと呼ばれる DataBinding モードがあります。
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource}"/>
于 2013-01-20T07:21:12.430 に答える