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

您正在寻找一个 DataBinding 更新 ViewModel 但反之亦然,因此有一个 DataBinding 模式调用OneWayToSourceex :
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource}"/>

于 2013-01-20T07:21:12.430 回答
0

你有两个解决方案。

  • 作为 DataGrids 集合的一个项目的每个 VM 都可以实现IsSelected属性。然后您应该调整绑定并通知父虚拟机更新其属性SelectedItemSelectedItems
  • 我们希望SelectedItems在两个方向(VM -> V 和 V -> VM)上工作,而不需要为IsSelected项目声明属性。
    我编写了带有几个附加属性的静态类 SelectionHelper。这些属性之一接受项目集合并保持 DataGrid.SelectedItems 与其同步。因此,我们可以控制来自 VM 的选择。
    另一个属性是 type ICommand。每次用户操作更改选择时,都会执行此命令。该命令的参数是DataGrid.SelectedItems 集合。
    现在我计划支持直接操作绑定集合而不是执行命令。

如果你需要我可以在明天来办公室时分享代码。

于 2013-01-20T09:58:48.113 回答