У меня есть DataGrid, привязанный к объекту с информацией о каждом столбце (используя Caliburn Micro Framework).На основании значений некоторых столбцов, когда я нажимаю конкретную кнопку, рассчитываются данные в других столбцах.Но чтобы увидеть изменения, мне нужно либо щелкнуть, чтобы отсортировать любой столбец, либо прокрутить вниз и вверх.Итак, я уверен, что данные рассчитаны правильно и значения изменены.Но я хотел бы видеть изменения, когда они происходят (после нажатия кнопки).Не знаю, как «обновить» то, что видно на экране.Я нашел несколько ответов, но они меня не удовлетворяют.Большинство из них предполагают, что у меня есть объект DataGrid во ViewModel, и у меня есть что-то другое.Можно ли обновить представление после изменения?
Выбранный элемент в классе DataGrid:
public class ItemModel
{
private string code;
public string Code
{
get { return code; }
set { code = value; }
}
private int targetCover = 10;
public int TargetCover
{
get { return targetCover; }
set { targetCover = value; }
} // TargetCover
private bool week_1 = true;
public bool Week_1
{
get { return week_1; }
set { week_1 = value;
Calculate_avg_sales();
}
} // Week_1
private bool week_2 = true;
public bool Week_2
{
get { return week_2; }
set { week_2 = value;
Calculate_avg_sales();
}
} // Week_2
private bool week_3 = true;
public bool Week_3
{
get { return week_3; }
set { week_3 = value;
Calculate_avg_sales();
}
} // Week_3
private bool week_4 = true;
public bool Week_4
{
get { return week_4; }
set { week_4 = value;
Calculate_avg_sales();
}
} // Week_4
private bool week_5 = true;
public bool Week_5
{
get { return week_5; }
set { week_5 = value;
Calculate_avg_sales();
}
} // Week_5
private BindableCollection<ItemStoresModel> stores = new BindableCollection<ItemStoresModel>();
public BindableCollection<ItemStoresModel> Stores
{
get { return stores; }
set { stores = value; }
}
public ItemModel()
{
} // ItemModel()
public void Allocation()
{
Clear_allocation();
foreach (var item in Stores)
{
if (item.Eff_aft_all < item.Min)
{
while(item.Eff_aft_all < item.Min)
{
item.Pc_all += 1;
item.Calculate_after_allocation();
}
} // if eff_stock is less than minimum
if (item.Af_all_cov < TargetCover &&
item.Eff_aft_all < item.Max &&
(item.Eff_aft_all + item.Qty_multiple) <= item.Max)
{
while(item.Af_all_cov < TargetCover &&
item.Eff_aft_all < item.Max &&
(item.Eff_aft_all + item.Qty_multiple) <= item.Max)
{
item.Pc_all += 1;
item.Calculate_after_allocation();
} // while conditions are meet, allocate additional pack
} // if cover after allocation is less than targeted cover
} // foreach() item (store) calcuate allocation
} // Allocation()
public void Clear_allocation()
{
foreach (var item in Stores)
{
item.Pc_all = 0;
item.Calculate_after_allocation();
}
} // Clear_allocation()
public void Calculate_avg_sales()
{
int number;
int result;
foreach (var item in Stores)
{
number = 0;
result = 0;
if (Week_1) { number++; result += item.Week_1; }
if (Week_2) { number++; result += item.Week_2; }
if (Week_3) { number++; result += item.Week_3; }
if (Week_4) { number++; result += item.Week_4; }
if (Week_5) { number++; result += item.Week_5; }
if (number==0) { item.Avg_sales = 0; }
if (number!=0) { item.Avg_sales = (double)(result) / number;}
} // foreach
} //Calculate_avg_sales()
} // class ItemModel
В моем ShellViewModel у меня есть объект этого класса с именем SelectedItem.
Код кнопки:
public void Allocate()
{
SelectedItem.Allocation();
} // Allocate()
XAML:
<DataGrid x:Name="stores" SelectionUnit="CellOrRowHeader" AutoGenerateColumns="False"
CanUserAddRows="False" SelectionMode="Single" ItemsSource="{Binding SelectedItem.Stores}">
<DataGrid.Resources>
<SolidColorBrush x:Key="backColour" Color="#E9E9E9" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Str" Binding="{Binding Str}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{StaticResource backColour}"/>
<Setter Property="Foreground" Value="Black" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Grade" Binding="{Binding Grade}" IsReadOnly="True"/>
<DataGridTextColumn Header="Avg sales" FontWeight="SemiBold" Binding="{Binding Avg_sales, StringFormat=F1}" IsReadOnly="True"/>
<DataGridTextColumn Header="Week 1" Binding="{Binding Week_1}" IsReadOnly="True"/>
<DataGridTextColumn Header="Week 2" Binding="{Binding Week_2}" IsReadOnly="True"/>
<DataGridTextColumn Header="Week 3" Binding="{Binding Week_3}" IsReadOnly="True"/>
<DataGridTextColumn Header="Week 4" Binding="{Binding Week_4}" IsReadOnly="True"/>
<DataGridTextColumn Header="Week 5" Binding="{Binding Week_5}" IsReadOnly="True"/>
<DataGridTextColumn Header="Cover" FontWeight="SemiBold" Binding="{Binding Cover, StringFormat=F1}" IsReadOnly="True"/>
<DataGridTextColumn Header="Af. all cov" FontWeight="SemiBold" Binding="{Binding Af_all_cov, StringFormat=F1}" IsReadOnly="True"/>
<DataGridTextColumn Header="Min" Binding="{Binding Min, Mode=TwoWay}" IsReadOnly="False"/>
<DataGridTextColumn Header="Max" Binding="{Binding Max, Mode=TwoWay}" IsReadOnly="False"/>
<DataGridTextColumn Header="Stock" Binding="{Binding Stock}" IsReadOnly="True"/>
<DataGridTextColumn Header="Eff stock" FontWeight="SemiBold" Binding="{Binding Eff_stock}" IsReadOnly="True"/>
<DataGridTextColumn Header="Eff aft. all" FontWeight="SemiBold" Binding="{Binding Eff_aft_all}" IsReadOnly="True"/>
<DataGridTextColumn Header="Qty all" Binding="{Binding Qty_all}" IsReadOnly="True"/>
<DataGridTextColumn Header="Pc. all" FontWeight="Bold" Binding="{Binding Pc_all , Mode=TwoWay}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
РЕДАКТИРОВАТЬ:
Выбранный элемент в ViewModel
public ItemModel SelectedItem
{
get { return selectedItem; }
set {
selectedItem = value;
NotifyOfPropertyChange(() => SelectedItem);
}
} // SelectedItem
Добавление "NotifyOfPropertyChange (() =>SelectedItem);»ничего не изменилось.