2

我有一个非常简单的案例,我认为使用模板会受益(但我不确定,这就是我要问的原因)。我见过的所有模板示例要么假设比我拥有更多的知识,要么太具体以至于对像我这样的新手没有太大用处,要么包含许多辅助内容,难以识别模板的一部分。

这是设置:我有两个并排的标签,第一个标签填充了字段的名称,第二个标签填充了字段的值。

这是我目前在我的应用程序中拥有的 XAML(很多次):

<StackPanel Style="{StaticResource horizontalStackerStyle}">
    <Label Style="{StaticResource labelStyle}">Field One:</Label>
    <Label Style="{StaticResource valueStyle}" Name="field1" 
        Content="{Binding dataObject.field1}" />
</StackPanel>

我想创建一个模板,这样我就可以像这样编写 XAML:

<CustomControlOrWhatever 
    FieldName="Field One:" 
    FieldValue="{Binding dataObject.field1}"/>

我有一种感觉,我可以用某种模板来做到这一点。这样做的一个好处是我不需要一遍又一遍地指定样式。我对么?我该怎么做?

提前致谢!

更新:

仍然没有找到这个问题的答案。我使用 Dependency Properties 选择了一个可能的解决方案,并尝试在此处提出一个澄清问题。好吧,第一响应者说我实际上不需要用 DP 废话把我的代码弄得乱七八糟,所以我再次更改了它——它仍然不起作用。任何人都可以提出一个可行的解决方案吗?这似乎应该如此简单。

需要明确的是:这只需要单向绑定,每隔几秒更新一次值。

4

3 回答 3

2

您要求的基本上是用户控件。

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SomeNameSpace.SomeControlName">
    <Grid x:Name="LayoutRoot">
     <StackPanel Style="{StaticResource horizontalStackerStyle}">
      <Label Style="{StaticResource labelStyle}" x:Name="FieldNameLbl"></Label>
      <Label Style="{StaticResource valueStyle}" x:Name="ValueLbl">
      </StackPanel>
    </Grid>
</UserControl>

在后面的代码中,您需要公开两个设置控件值的属性。

public string FieldName
{
    get { return FieldNameLbl.Text; }
    set { FieldNameLbl.Text = value; }
}

public string FieldValue
{
    get { return ValueLbl.Text; }
    set { ValueLbl.Text = value; }
}

然后调用它,您可以将其与其余声明一起放在窗口/页面的顶部:

xmlns:Controls="clr-namespace:SomeNameSpace" 

然后您可以将控件插入到您的窗口/页面中,如下所示:

<Controls:NameOfYourControl FieldName="Field One:" FieldValue="{Binding dataObject.field1}"/>
于 2009-07-17T14:48:02.803 回答
1

您可以为和创建一个UserControl调用FieldControl并定义支持(自动)属性。(普通属性就可以了,只要你只需要绑定一次,这可能就是这种情况。)FieldNameFieldValue

XAML 代码可能如下所示:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="foo.bar">
    <StackPanel Style="{StaticResource horizontalStackerStyle}">
        <Label Style="{StaticResource labelStyle}" Content="{Binding Path=FieldName, Mode=OneTime, StringFormat='{0}: '}"/>
        <Label Style="{StaticResource valueStyle}" Content="{Binding Path=FieldValue, Mode=OneTime}" />
    </StackPanel>
</UserControl>

希望有帮助。

于 2009-07-17T14:48:14.737 回答
0

您想要做的类似于关于将图像放在按钮上的讨论,使用一种简单的方式指定路径,例如<Button MyImage="foo.jpg" />. 请按照本文了解实际详细信息。

总结一下:

  • 一种明显的方法是创建一个包含两个标签并公开两个属性的 UserControl。这里没有太多模板。

  • 最 WPFish 解决方案似乎是在一个标签上使用两个附加属性(比如值),并为其提供一个包含另一个标签(描述)的控件模板。在模板中,您将每个标签文本绑定到相应的附加属性值。

于 2009-07-17T14:48:52.037 回答