任何人都知道如何通过 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
您正在寻找一个 DataBinding 更新 ViewModel 但反之亦然,因此有一个 DataBinding 模式调用OneWayToSource
ex :
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource}"/>
于 2013-01-20T07:21:12.430 回答
0
你有两个解决方案。
- 作为 DataGrids 集合的一个项目的每个 VM 都可以实现
IsSelected
属性。然后您应该调整绑定并通知父虚拟机更新其属性SelectedItem
或SelectedItems
- 我们希望
SelectedItems
在两个方向(VM -> V 和 V -> VM)上工作,而不需要为IsSelected
项目声明属性。
我编写了带有几个附加属性的静态类 SelectionHelper。这些属性之一接受项目集合并保持 DataGrid.SelectedItems 与其同步。因此,我们可以控制来自 VM 的选择。
另一个属性是 typeICommand
。每次用户操作更改选择时,都会执行此命令。该命令的参数是DataGrid.SelectedItems 集合。
现在我计划支持直接操作绑定集合而不是执行命令。
如果你需要我可以在明天来办公室时分享代码。
于 2013-01-20T09:58:48.113 回答