1

我正在创建一个应用程序,用于在单个窗口中编辑大量产品规格。

我有一堆尺寸(以英寸为单位),我想创建一个简单的模板,该模板将针对每个尺寸显示分数和十进制值的值。它基本上是一个TextBlock 和两个TextBox。

英寸控制界面

但我不知道如何指定 TextBlock 的文本(在本例中为宽度)。
我希望能够在 ContentControl 声明(或类似的东西)中指定它。

这是我的数据模板:

<Window.Resources>
    <DataTemplate x:Key="InchesInputTemplate">
        <StackPanel>
            <TextBlock Text="{Binding}" /> <!-- How should I define the binding ? -->
            <TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=Content, Converter=InchesToFractionConverter}" />
            <TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=Content}" />
        </StackPanel>
    </DataTemplate>
</Window.Resources>

然后我在 ContentControl 中使用它:

<ContentControl Content="{Binding Width}" 
                ContentTemplate="{StaticResource InchesInputTemplate}"
                LabelText="Width :" />

还有我的简化产品类(它将包含更多维度):

public class Product
{
    private string _productCode;

    public string ProductCode
    {
        get { return _productCode; }
        set { _productCode = value; }
    }

    private float _width;

    public float Width
    {
        get { return _width; }
        set { _width = value; }
    }
}

为我的每个维度(在我的示例中为 LabelText 属性)指定标签文本的最佳方法是什么?

4

1 回答 1

2

您可以使用该Tag物业

<DataTemplate x:Key="InchesInputTemplate">
  <StackPanel>
    <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentControl}}, Path=Tag}" />
    <!--  How should I define the binding ?  -->
    <TextBox Text="{Binding Inches, Converter=InchesToFractionConverter}" />
    <TextBox Text="{Binding Inches}" />
  </StackPanel>
</DataTemplate>

<ContentControl Content="{Binding Width}" 
                ContentTemplate="{StaticResource InchesInputTemplate}"
                Tag="Width :" />

更新:

如果您不想使用该Tag属性,则可以使用Attached Property

public class MyLabelPropertyClass {
  public static readonly DependencyProperty MyLabelTextProperty =
    DependencyProperty.RegisterAttached(
      "MyLabelText",
      typeof(string),
      typeof(MyLabelPropertyClass),
      new FrameworkPropertyMetadata(
        string.Empty, FrameworkPropertyMetadataOptions.Inherits));

  public static void SetMyLabelText(UIElement element, string value) {
    element.SetValue(MyLabelTextProperty, value);
  }

  public static string GetMyLabelText(UIElement element) {
    return (string)element.GetValue(MyLabelTextProperty);
  }
}

<DataTemplate x:Key="InchesInputTemplate">
  <StackPanel>
    <TextBlock Text="{Binding Path=(local:MyLabelPropertyClass.MyLabelText), RelativeSource={RelativeSource Self}}" />
...
</DataTemplate>
...
<ContentControl Content="{Binding Width}"
                ContentTemplate="{StaticResource InchesInputTemplate}"
                local:MyLabelPropertyClass.MyLabelText="Width :" />

备用

如果您想ContentControl使用普通的Dependency 属性进行子类化:

public class MyCustomContentControl : ContentControl {
  public static readonly DependencyProperty MyLabelTextProperty =
    DependencyProperty.Register(
      "MyLabelText",
      typeof(string),
      typeof(MyCustomContentControl),
      new FrameworkPropertyMetadata(string.Empty));

  public string MyLabelText {
    get {
      return (string)GetValue(MyLabelTextProperty);
    }
    set {
      SetValue(MyLabelTextProperty, value);
    }
  }
}

<DataTemplate x:Key="InchesInputTemplate">
  <StackPanel>
    <TextBlock Text="{Binding Path=MyLabelText, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyCustomContentControl}}}" />
...
</DataTemplate>
...
<local:MyCustomContentControl ContentTemplate="{StaticResource InchesInputTemplate}"
                              MyLabelText="Width :" />
于 2013-06-21T14:24:38.193 回答