【问题标题】:WPF+Datagrid+CellUpdate: How to programmatically implementWPF+Datagrid+CellUpdate:如何以编程方式实现
【发布时间】:2017-01-18 02:18:47
【问题描述】:

我有一个 WPF 应用程序。像这样:

            <DataGrid x:Name="MetroDataGrid"
                      CanUserReorderColumns="False"
                      Grid.Row="1"
                      ScrollViewer.CanContentScroll="True"
                      ScrollViewer.VerticalScrollBarVisibility="Visible"
                      ScrollViewer.HorizontalScrollBarVisibility="Visible"
                      Grid.Column="1"
                      CanUserResizeRows="False"
                      CanUserDeleteRows="True"
                      Margin="1"
                      AutoGenerateColumns="False"
                      HeadersVisibility="All"
                      ItemsSource="{Binding Path=Invoicelines, Mode=TwoWay}"
                      CanUserSortColumns="False"
                      SelectionUnit="FullRow">

Invoicelines 是我的 viewmodel 类中的 ObservableCollection 属性。

此网格包含三列:其中两列必须汇总,第三列应包含结果。

请注意,我的 ViewModelClass 现在实现了 INotifyPropertyChanged 接口。

我尝试了 CellEditEnding 事件,但对于数据网格的特定行,我仍然无法获得从前两个单元格更新的第三个单元格。

你如何解决这个问题?

编辑(部分工作......现在的问题是因为我已经为所有列附加了 Cantidad 属性,然后在更改此列中的单元格时的所有行,将此更改传递给其余行同一列... 我还缺少什么?)

XAML

                <DataGridTemplateColumn Header="Cant." 
                                        Width="100"
                                        MinWidth="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Controls:NumericUpDown Value="{Binding DataContext.Cantidad, UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                                                    Minimum="0"
                                                    Interval="0.5"
                                                    StringFormat="0.000"
                                                    HideUpDownButtons="True"
                                                    ></Controls:NumericUpDown>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

视图模型

class InvoiceViewModel : ViewModelBase
{
    private ObservableCollection<InvoiceLine> invoicelines;

    public ObservableCollection<InvoiceLine> Invoicelines{
        set {
            invoicelines = value;
            OnPropertyChanged("Invoicelines");
        }
        get { return invoicelines; }
    }

    public decimal Cantidad {
        get { return cantidad; }
        set {
            if (Equals(value, cantidad)) return;
            cantidad = value;
            OnPropertyChanged();
        }
    }

    public decimal Preciounit {
        get { return preciounit; }
        set
        {
            if (Equals(value, preciounit)) return;
            preciounit = value;
            OnPropertyChanged();
        }
    }
}

ViewModelBase

class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

型号

public class InvoiceLine
{
    public decimal Cantidad { get; set; }
    public decimal Preciounit { get; set; }
    public decimal Subtotal { get; set; }
}

【问题讨论】:

    标签: c# wpf data-binding datagrid


    【解决方案1】:

    我尝试使用这样的第一列:&lt;DataTemplate&gt; &lt;Controls:NumericUpDown Value="{Binding Cantidad2}"&gt;&lt;/Controls:NumericUpDown&gt; &lt;/DataTemplate&gt;。但是当我调试编译器时仍然没有进入 Cantidad2 属性..我错过了什么吗?

    如果您使用 MahApps 中的 NumericUpDown,您应该尝试将绑定的 UpdateSource 属性设置为 PropertyChanged:

    <controls:NumericUpDown Value="{Binding Cantidad2, UpdateSourceTrigger=PropertyChanged}" />
    

    然后应该调用 Cantidad2 属性的设置器,前提是您的“Invoicelines”集合中的数据对象实际上具有名为“Cantidad2”的适当类型的属性(可能是double,具体取决于您使用的 NumericUpDown 控件使用)。

    编辑:如果您想绑定到 InvoiceViewModel 类的属性,您应该使用 RelativeSource:

    <controls:NumericUpDown Value="{Binding DataContext.Cantidad, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
    

    【讨论】:

    • 嗨.. 使用源代码更新帖子...仍然无法将属性捕获到 ViewModel 类中。
    • 我没有看到“Cantidad”属性?你不应该绑定到“Preciounit”属性吗?您的“Invoicelines”源集合的类型是什么?
    • 嗨..源代码更新..你认为我错过了什么吗?
    • 您是要设置 InvoiceLine 类还是 InvoiceViewModel 类的 Cantidad 属性?
    • 好点!!控件将指向模型类的 Get 方法...但我需要指向 ViewModel 类中的方法...
    【解决方案2】:

    如果我理解正确,您正在尝试更改前两列并将结果显示到第三列。

    您的计算逻辑位于何处?

    您可以将前两个与 VM 属性绑定,第三个与计算值绑定(单向绑定)。

    当前两个属性的值更新时,第三个属性的值会自动更新。您需要在所有三个中引发PropertyChanged 事件。

               <DataGridTemplateColumn Header="FirstValue">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding FirstValue}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
    
               <DataGridTemplateColumn Header="SecondValue">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding SecondValue}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>                    
    
                <DataGridTemplateColumn Header="ThirdValue">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding ThirdValue, Mode=OneWay}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
    

    【讨论】:

    • 嗨 Xlr8。我尝试使用这样的第一列:。 CellTemplate> 但是当我调试时编译器仍然没有进入Cantidad2 属性..我错过了什么吗?
    • 嗨.. 使用源代码更新帖子...仍然无法将属性捕获到 ViewModel 类中。
    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多