为什么我的自定义控件总是只读?

时间:2014-02-27 15:57:30

标签: c# xaml visual-studio-lightswitch

我正在开发一个LightSwitch自定义控件,它能够(好吧,至少这个......)根据区分值绑定和编辑各种不同的属性。

让我再解释一下。该表如下所示: enter image description here

现在,根据Datenformat的值,控件会自动将其自身绑定到ErgebnisBoolErgebnisDatum等等,并从控件的{{{{{}中选择适当的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

1 个答案:

答案 0 :(得分:2)

您只需要从IsHitTestVisile=False中移除multi:MtTemplateSelector,这可以防止它及其所有孩子从用户互动中获取事件。您可以了解更多here