1

1 つのウィンドウで多くの製品仕様を編集するために使用するアプリケーションを作成しています。

たくさんの寸法 (インチ単位) があり、各寸法の値を分数と小数値の両方で表示する単純なテンプレートを作成したいと考えています。基本的には TextBlock と 2 つの TextBox です。

インチコントロールUI

しかし、TextBlock のテキスト (この場合は Width) を指定する方法がわかりません。
ContentControl宣言(または同様のもの)で指定できるようにしたいと思います。

これが私の DataTemplate です:

<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 :" />

そして、私の簡略化された Product クラス (さらに多くのディメンションが含まれます):

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を使用できます。

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 に答える