简体   繁体   中英

Bind DataGridTextColumn to method WPF

Is it possible to bind a DataGridTextColumn to a method in my xaml.cs?

This is my XAML

           <my:DataGrid.Columns>
                <my:DataGridTextColumn Binding="{Binding IdItem}" Header="Id Item" Width="150" IsReadOnly="True"/>

                <my:DataGridTextColumn Binding="{Binding concatenarMoneda}" Header="Costo" Width="*"/>
            </my:DataGrid.Columns>

and I want to bind the second column to the following function

private string concatenarMoneda
    {
        get { 
            return viewModel.Registro.Costo.ToString() + " " + viewModel.Registro.SOSMoneda.Descripcion; 
        }
    }

This should result in two properties being concatenated in the same column

I have seen this working with a textblock but it is not working in this case.

See Bind property to method

UPDATE more code as requested

this is my whole grid

  <Grid Grid.Row="2" Background="{DynamicResource GrisOscuro}">
        <my:DataGrid EnableRowVirtualization="False" x:Name="DataGridDatos" Margin="32"
                     HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                     AutoGenerateColumns="False" Background="White"                    
                     SelectionChanged="DataGridDatos_SelectionChanged"
                     SelectedItem="{Binding Registro}"
                     ItemsSource="{Binding Registros}"
                     IsEnabled="{Binding DataGridDatosEstado}"
                     SelectedIndex="{Binding IndiceActual}"
                     IsReadOnly="True">
            <my:DataGrid.Columns>
                <my:DataGridTextColumn Binding="{Binding IdItem}" Header="Id Item" Width="150" IsReadOnly="True"/>
                <my:DataGridTextColumn Binding="{Binding SOSProveedor.Nombre}" Header="Proveedor" Width="150" IsReadOnly="True"/>
                <my:DataGridTextColumn Binding="{Binding SOSServicio.Descripcion}" Header="Servicio" Width="*"/>
                <my:DataGridTextColumn Binding="{Binding SOSUbicacion.Descripcion}" Header="Ubicacion" Width="*"/>
                <my:DataGridTextColumn Binding="{Binding SOSTipoPagoItem.Descripcion}" Header="Tipo Pago Item" Width="*"/>
                <my:DataGridTextColumn Binding="{Binding FechaInicioVigencia , StringFormat={}{0:dd/MM/yy}}" Header="Fecha Inicio" Width="*"/>
                <my:DataGridTextColumn Binding="{Binding Estatus}" Header="Estatus" Width="*"/>
                <my:DataGridTextColumn  Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, 
            Path=concatenarMoneda,Mode=OneWay}" Header="Costo" Width="*"/>
            </my:DataGrid.Columns>
        </my:DataGrid>
    </Grid>

that grid is sorrounded by which is the parent element within the XAML

on the other in my xaml.cs I've got the concatenarMoneda function that I showed above

and my ViewModel brings all the data from the Model... using methods such as this

public ObservableCollection<SOSItem> Items
    {
        get
        {
            if (_items == null)
            {
                _items = new ObservableCollection<SOSItem>(db.SOSItems.Select(AppRow => AppRow));
            }
            return _items;
        }
        set
        {
            _items = value;
            NotifyPropertyChanged("Items");
        }
    }

Maybe the ancestor type you suggest should be other than

  AncestorType={x:Type Window}

?

You need to use IMultiValueConverter as GertHermans mentioned.

 <DataGridTextColumn  Width="70" Header="Costo">
                <DataGridTextColumn.Binding>
                    <MultiBinding Converter="{StaticResource ConcatConverter}">
                        <Binding Path="Costo" />
                        <Binding Path="SOSMoneda.Descripcion" />
                    </MultiBinding>
                </DataGridTextColumn.Binding>
            </DataGridTextColumn>



 public class ConcatConverter : IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameters, CultureInfo culture)
            {
                return values[0].ToString() + " " + values[1].ToString();
            }



            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM