DataGrid-应用更改,但使用当前数据使用CellTemplate



我正在尝试制作一个datagrid,用户可以在其中编辑数据并应用之后应用ODER取消更改。此外,一个DataGridCell具有TemplateSelector,可以帮助用户输入有效数据。(DateTime, Boolean,...)我的模型有一些属性。对于我的问题,有两个相关: Model.TypeModel.Value

在CodeBehind中,我的属性具有类型:

enum Type;
string Value;

用户编辑Value时,模板运行仪应根据Type

获得正确的数据定位板

我的XAML看起来像这样:

    <DataGrid x:Name="datagrid"                       
                      ItemsSource="{Binding Variables}"                       
                      HorizontalAlignment="Stretch"                       
                      VerticalAlignment="Stretch"                       
                      AutoGenerateColumns="False"                                  
                      IsSynchronizedWithCurrentItem="True">
                <DataGrid.Columns>
                    <DataGridComboBoxColumn Header="{StaticResource VariablesType}" 
                                            ItemsSource="{Binding Source={StaticResource VariableTypes}, Mode=OneWay}" 
                                            SelectedItemBinding="{Binding Type}" 
                                            Width="80"/>
                    <DataGridTemplateColumn Header="{StaticResource VariablesValue}" Width="2*">
                        <DataGridTemplateColumn.CellEditingTemplateSelector>
                            <TemplateSelector:TemplateSelector_Variables>
                                <!--Definitin of Templates,..-->
                            </TemplateSelector:TemplateSelector_Variables>
                        </DataGridTemplateColumn.CellEditingTemplateSelector>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Value}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
     </DataGrid>

让我们进入templateselector:

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item == null)
            return base.SelectTemplate(item, container);
        RaVariableType VariablenType = ((RaVariable)item).Type;
        //SelectingLogic
        //Here I would need the CURRENT type but it gives me the type of my Model
    }

我有一个解决方案:如果我使用:

SelectedItemBinding="{Binding Type, UpdateSourceTrigger="PropertyChanged"}"

它有效,但我想处理用户的OKCancel,此代码更改了我的模型。

另一个问题:您如何处理这样的决定。(您如何更新命令的模型 - 代码)

谢谢!

您是否正在使用MVVM模式。您需要在视图模型中处理它,只需将按钮绑定到datagrid的SelectedItem,并在调用命令时使用它。做这种事情的理想方法是使用命令(基本上是MVVM模式),您可以在数据对象(viewModel)和call button.command中创建一个命令。

示例在此处显示

<DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Button 
                      Command="{Binding   Path=DataContext.OKCommand,       
RelativeSource= {RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}}">
                        </Button>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>

查看模型代码

 RelayCommand _okCommand;
public ICommand okCommand
{
    get
    {
        if (_ok == null)
        {
            _ok= new RelayCommand(param => this.Show());
        }
        return _ok;
    }
}
private void Show()
{
    if (Parent != null)
    {
        // Handle ok logic Here
    }
}

您是否使用任何模式,例如Ninject,Unity等和实体框架来处理DB层代码?您的ViewModel将包含属性,网格的列名应来自模型属性。属性值更改后,您需要编写保存逻辑可能使用EF或LINQ到SQL DB代码。保存逻辑将通过单独的类来处理,如果用户单击一个按钮,则视图模型应调用接口方法并进行保存。您的类的实例处理保存逻辑将由Unity或ninject提供(取决于您的实现)。您的依赖项将被注入您的视图模型,并且您的视图模型将暴露于视图绑定的属性。

用于将所选项目从网格传递到模型在ViewModel中创建一个属性,以保存所选用户:public用户selecteruser {get;放;}

绑定datagrid视图的selecteditem与此属性:selectedItem =" {binding selectionuser}"

有几种方法可以在数据杂志中选择项目。这仅取决于哪种最适合您的情况

第一个和最基本的是SelectedIndex,这只会在DataGrid中的该索引上选择该行

<DataGrid SelectedIndex="{Binding SelectedIndex}" />
private int _selectedIndex;
public int SelectedIndex
{
get { return _selectedIndex; }
set { _selectedIndex = value; NotifyPropertyChanged("SelectedIndex"); }
}

selectedindex = 2;

SelectedItem将选择与您设置的行匹配的行

<DataGrid SelectedItem="{Binding SelectedRow}" />
private DataRow _selectedRow;
public DataRow SelectedRow
{
get { return _selectedRow; }
set { _selectedRow = value; NotifyPropertyChanged("SelectedRow");}
}
SelectedRow = items.First(x => x.whatever == something);

最常见的是选择选择的Valuepath集,在这种情况下,您可以选择要选择的列,然后可以通过设置相应的值

来选择行
<DataGrid SelectedValuePath="Size Quantity" SelectedValue="{Binding SelectionValue}" 
private string _selectedValue
public string SelectionValue 
  {
get { return _selectedValue; }
set { _selectedValue = value; NotifyPropertyChanged("SelectionValue"); }
}
SelectionValue = "Blue";

xaml示例

<Window x:Class="WpfApplication21.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="202" Width="232" Name="UI">
<Grid DataContext="{Binding ElementName=UI}">
    <DataGrid SelectedValuePath="Size Quantity"        
              SelectedValue="{Binding SelectionValue}" 
              SelectedIndex="{Binding SelectedIndex}"
              ItemsSource="{Binding SizeQuantityTable}"
              AutoGenerateColumns="True" 
              Margin="0,0,0,41" />
    <StackPanel Orientation="Horizontal" Height="37" VerticalAlignment="Bottom" >
        <Button Content="SelectedIndex" Height="26"  Width="107" Click="Button_Click_1"/>
        <Button Content="SelectedValue" Height="26"  Width="107" Click="Button_Click_2"/>
    </StackPanel>
</Grid>
</Window>

最新更新