我正在尝试制作一个datagrid,用户可以在其中编辑数据并应用之后应用ODER取消更改。此外,一个DataGridCell
具有TemplateSelector
,可以帮助用户输入有效数据。(DateTime, Boolean,...)
我的模型有一些属性。对于我的问题,有两个相关: Model.Type
和Model.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"}"
它有效,但我想处理用户的OK
或Cancel
,此代码更改了我的模型。
另一个问题:您如何处理这样的决定。(您如何更新命令的模型 - 代码)
谢谢!
您是否正在使用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>