Я пишу приложение (мое первое использование WPF), которое показывает данные для продуктов в сетке данных. У меня получилось соединить сетку данных с базой данных MS SQL. Я застрял на создании рассчитанного столбца.
Я заинтересован в умножении значений из двух столбцов. Я хочу использовать Pcs_DC_col и Qty_multi_col для вычисления значений в Qty_DC_col .
Из того, что я понимаю, я должен использовать конвертер, и поскольку я использую более 1 столбца, я должен использовать IMultiValueConverter. Но не знаю, как написать код, который показывал бы мне нечто отличное от пустых ячеек или dependencyproperty.unsetvalue . Что я должен добавить или изменить, чтобы он работал?
XAML код:
<Window.Resources>
<local:ColumnConverter x:Key="ColumnConversion"/>
</Window.Resources>
<Grid>
<DataGrid x:Name="matrix" SelectionUnit="FullRow" SelectionChanged="PLU_row_selected"
AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="PLU" Binding="{Binding PLU}"/>
<DataGridTextColumn Header="config" Binding="{Binding config}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Colour" Binding="{Binding Colour}"/>
<DataGridTextColumn Header="Promo" Binding="{Binding Promo}"/>
<DataGridTextColumn Header="Department" Binding="{Binding Department}"/>
<DataGridTextColumn Header="Category" Binding="{Binding Category}"/>
<DataGridTextColumn Header="Price" Binding="{Binding Price}"/>
<DataGridTextColumn x:Name="Pcs_DC_col" Header="Pc.s DC" Binding="{Binding Pcs Dc}"/>
<DataGridTextColumn Header="Allocated Pcs" Binding="{Binding Allocated Pcs}"/>
<DataGridTextColumn x:Name="Qty_DC_col" Header="Qty DC">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding ElementName="Pcs_DC_col" Path="Text"/>
<Binding ElementName="Qty_multi_col" Path="Text"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="Qty All" Binding="{Binding obliczenia}"/>
<DataGridTextColumn Header="Qty Tra" Binding="{Binding Qty Tra}"/>
<DataGridTextColumn Header="Qty Str" Binding="{Binding Qty Str}"/>
<DataGridTextColumn x:Name="Qty_multi_col" Header="Qty multiple" Binding="{Binding Qty Multiple}"/>
<DataGridTextColumn Header="% all" Binding="{Binding Percent_Allo}"/>
<DataGridTextColumn Header="Value all" Binding="{Binding Value_allocated}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Код конвертера:
public class ColumnConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return 0;
try
{
return String.Format("{0}", values[0]);
}
catch
{
return 0;
}
} // Convert()
Эта версия показывает мне пустой столбец, и если я изменю код на:
return String.Format("{0}", values[0]);
Это заполнить мой столбец с dependencyproperty.unsetvalue .
Код загрузки данных из базы данных в Grid:
private void load_products_to_grid()
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = @"Server = batorego426\coreSQL; Database = CorpCore; Integrated Security=true;";
myConnection.Open();
SqlCommand query = new SqlCommand();
query.CommandText = "select * from [products]";
query.Connection = myConnection;
SqlDataAdapter adapter = new SqlDataAdapter(query);
DataTable product_table = new DataTable("products");
adapter.Fill(product_table);
matrix.ItemsSource = product_table.DefaultView;
}
EDIT:
Я изменил ставку, как Энди предложил
<DataGridTextColumn x:Name="Qty_DC_col" Header="Qty DC">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding Path="Pcs_DC_col"/>
<Binding Path="Qty_multi_col"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
и код конвертера:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return 0;
return (int)values[0]*(int)values[1];
}
Но все равно я получаю пустой столбец, и я попытался изменить код в конвертере, чтобы проверить, можно ли увидеть какое-либо значение:
String.Format("{0}", values[0]);
Но тогда получите "dependencyproperty.unsetvalue" в этом столбце. Так что я думаю, что данные все еще не связаны и даже не равны нулю, но не имеют tset. Что еще я могу сделать?