0

我一直在尝试使用 Lightswitch 并尝试添加自定义控件,但是所有示例和我的测试都表明数据绑定有问题。

例如,我有一个颜色表,其成员名为:

string ColorName;    // Name of colour
string ColorHex;     // #Html Color string

我有一个简单的自定义控件,可以将其中一种颜色显示为带有其名称的小样本。

<UserControl 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  
    x:Class="LightSwitch.UserControls.HtmlColorControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Vero.LightSwitch.UserControls"
    mc:Ignorable="d"
    d:DesignHeight="30" d:DesignWidth="400">
    <UserControl.Resources>
        <local:ColorToSolidColorBrushValueConverter  x:Key="ColorToSolidColorBrushConverter"/>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="#FF28DFE8" MinWidth="100">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Rectangle Fill="{Binding Path=Screen.SelectedColor.ColorHex, Converter={StaticResource ColorToSolidColorBrushConverter}}" Margin="3" />
        <TextBox Text="{Binding Path=Screen.SelectedColor.ColorName}" Grid.Column="1" />
    </Grid>
</UserControl>

作为测试,我向屏幕添加了 SelectedColor 属性,然后添加了自定义控件,并将其数据上下文设置为 SelectedColor。

您会期望控件中的绑定只需要是"ColorName"and "ColorHex",但是绑定的实际数据上下文似乎是层次结构更高的东西(在屏幕上方),您需要有一个类似的路径"Screen.SelectedColor.ColorHex"。分配给自定义控件的数据上下文值似乎被完全忽略了。

我究竟做错了什么?在自定义控件中拥有完整的绑定路径是没有意义的,因为它们不应该知道数据来自哪里(只有上下文中有特定成员)。

4

1 回答 1

2

似乎很多 Lightswitch 的绑定示例不仅具有误导性,而且鼓励了一种完全不可移植的绑定自定义控件的方式

在深入研究之后,我发现如果您将自定义控件的数据上下文设置为屏幕内的实体,那么 DataContext 不仅会接收一个Screen属性(每个人似乎都将其用于绑定),而且它还会接收一个Value属性(这是屏幕选择的特定项目)。

上述示例的正确绑定是:

<Rectangle Fill="{Binding Path=Value.ColorHex, Converter={StaticResource ColorToSolidColorBrushConverter}}" Margin="3" />
<TextBox Text="{Binding Path=Value.ColorName}" Grid.Column="1" />

简单(一旦你知道如何)!

于 2013-06-27T08:56:41.717 回答