我正在开发一个LightSwitch自定义控件,它能够(好吧,至少这个......)根据区分值绑定和编辑各种不同的属性。
让我再解释一下。该表如下所示:
现在,根据Datenformat
的值,控件会自动将其自身绑定到ErgebnisBool
,ErgebnisDatum
等等,并从控件的{{{{{}中选择适当的DataTemplate
1}}。
xaml
是一个计算文本属性,它包含一个只读的显示字符串。
控件的xaml如下:
ErgebnisAnzeige
<UserControl x:Class="EuvControlsExtension.Presentation.Controls.ProzessErgebnisEdit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:framework ="clr-namespace:Microsoft.LightSwitch.Presentation.Framework;assembly=Microsoft.LightSwitch.Client"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:ct="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"
xmlns:multi="clr-namespace:EuvControlsExtension.Presentation.Controls"
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
mc:Ignorable="d"
x:Name="HostControl">
<multi:MtTemplateSelector x:Name="MyTemplateSelector"
Content="{Binding Path=RootEntity, Mode=TwoWay, ElementName=HostControl, UpdateSourceTrigger=Default}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Center"
IsHitTestVisible="False">
<!--Zahl-->
<multi:MtTemplateSelector.ZahlTemplate>
<DataTemplate>
<TextBox HorizontalAlignment="Stretch"
Text="{Binding Path=RootEntity.ErgebnisZahl, ElementName=HostControl, Mode=TwoWay, UpdateSourceTrigger=Default, ValidatesOnExceptions=True, NotifyOnValidationError=True}"/>
</DataTemplate>
</multi:MtTemplateSelector.ZahlTemplate>
<!--Bool-->
<multi:MtTemplateSelector.BoolTemplate>
<DataTemplate>
<CheckBox IsThreeState="True"
Content="{Binding Path=RootEntity.ErgebnisBool, ElementName=HostControl, Mode=TwoWay, UpdateSourceTrigger=Default, ValidatesOnExceptions=True, NotifyOnValidationError=True}"/>
</DataTemplate>
</multi:MtTemplateSelector.BoolTemplate>
</multi:MtTemplateSelector>
</UserControl>
类只返回当前格式的相应DataTemplate,这里没什么特别的。
控件本身(MtTemplateSelector
)也很简单。它不会绑定实体实例(称为ProzessErgebnisEdit
):
RootEntity
最后,我还有一个控制工厂,在适当的时候返回一个仅显示的DataTemplate:
public partial class ProzessErgebnisEdit : UserControl
{
public ProzessErgebnisEdit()
{
InitializeComponent();
BindProperties();
}
private void BindProperties()
{
var binding = new Binding("DataSourceRoot.RootObject")
{
Mode = BindingMode.TwoWay
};
this.SetBinding(RootEntityProperty, binding);
}
public object RootEntity
{
get { return GetValue(RootEntityProperty); }
set { SetValue(RootEntityProperty, value); }
}
public static readonly DependencyProperty RootEntityProperty = DependencyProperty.Register(
"RootEntity",
typeof(object),
typeof(ProzessErgebnisEdit),
new PropertyMetadata(null));
}
到目前为止一切正常:当单元格未聚焦时,仅显示文本(例如Wahr / Falsch / - ),当我单击编辑单元格时,它会切换到相应的DataTemplate(例如,复选框)。并且始终显示正确的值,这告诉我数据绑定通常有效。
唯一的问题是控件总是只读的,我无法通过代码或xaml或其他任何东西使它们可编辑。
到目前为止,我尝试拦截网格的[Export(typeof(IControlFactory))]
[ControlFactory("EuvControlsExtension:ProzessErgebnisEdit")]
internal class ProzessErgebnisEditFactory : IControlFactory
{
private DataTemplate dataTemplate;
private DataTemplate displayModeDataTemplate;
public DataTemplate DataTemplate
{
get {
return this.dataTemplate ??
(this.dataTemplate = XamlReader.Load(ControlTemplate) as DataTemplate);
}
}
public DataTemplate GetDisplayModeDataTemplate(IContentItem contentItem)
{
return this.displayModeDataTemplate ??
(this.displayModeDataTemplate = XamlReader.Load(DisplayModeControlTemplate) as DataTemplate);
}
private const string DisplayModeControlTemplate =
"<DataTemplate" +
" xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
" <Border Background='GreenYellow'>" +
" <TextBlock Text='{Binding Path=DataSourceRoot.RootObject.ErgebnisAnzeige}' Margin='3' Foreground='Red' " +
" TextAlignment=\"{Binding Properties[Microsoft.LightSwitch:RootControl/TextAlignment]}\"" +
" VerticalAlignment=\"{Binding Properties[Microsoft.LightSwitch:RootControl/VerticalAlignment]}\" />" +
" </Border>" +
"</DataTemplate>";
private const string ControlTemplate =
"<DataTemplate" +
" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" +
" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"" +
" xmlns:ctl=\"clr-namespace:EuvControlsExtension.Presentation.Controls;assembly=EuvControlsExtension.Client\">" +
"<ctl:ProzessErgebnisEdit/>" +
"</DataTemplate>";
}
事件,然后手动将相应列的OnPrepareCellEditing
属性设置为IsReadOnly
,我也尝试使用控件的false
1}}属性。没有运气......
我错过了什么?我的整个方法是否有缺陷?这里发生了什么?我无法弄清楚这种行为的原因,我甚至没有看到搜索的方向......
编辑:关于德语标识符 有些标识符是德语,因此可能并不是每个人都能立即清楚。但最终,它就像这样简单: Ergebnis 是 Result 的德语。此表达式经常出现在表中,因为要显示的值是物理生产过程的结果,该过程可以是各种数据类型,例如bool,string,datetime等(这里没什么特别的)。此信息是 Datenformat 列的内容,类似于英语中的 DataType 。
编辑2:模板选择器:
DataContext.IsReadOnly
答案 0 :(得分:2)
您只需要从IsHitTestVisile=False
中移除multi:MtTemplateSelector
,这可以防止它及其所有孩子从用户互动中获取事件。您可以了解更多here。