1

3 つのコントロールUserControlを含むがあります。TextBlockに 3 つのカスタム プロパティを実装したいと考えていますUserControl。何かのようなもの:

public partial class MyControl: UserControl
{
    ...
    public String Title
    {
        get { return this.textBlock1.Text; }
        set { this.textBlock1.Text = value; }
    }

    public String Units
    {
        get { return this.textBlock2.Text; }
        set { this.textBlock2.Text = value; }
    }

    public String Data
    {
        get { return this.textBlock3.Text; }
        set { this.textBlock3.Text = value; }
    }
}

これらのプロパティでバインディング機能を使用したい場合は、それらを依存関係プロパティとして実装する必要があります。私は正しいですか?しかし、私は私の場合にそれを行う方法がわかりません。

4

2 に答える 2

0

それは正しいです。依存関係プロパティへのバインドは非常に簡単です。メカニズムを理解するには、MSDN を参照することをお勧めします。ただし、質問に答えるには、ユーザー コントロールに登録された静的依存関係プロパティを提供します。次に、ゲッター \ セッターがプロパティを参照します。

依存関係プロパティのサンプル行を次に示します。

/// <summary>
/// Provides a bindable text property to the user control
/// </summary>
public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new PropertyMetadata("", onTextPropertyChanged));

/// <summary>
/// optional static call back handler when the property changed
/// </summary>
/// <param name="o"></param>
/// <param name="e"></param>
static void onTextPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
    var obj = o as UserControl1;
    if (obj == null)
        return;

    //TODO: Changed...
}

/// <summary>
/// Gets \ sets the text
/// </summary>
public string Text
{
    get { return (string)this.GetValue(TextProperty); }
    set
    {
        if (this.Text != value)
            this.SetValue(TextProperty, value);
    }
}

上記は非常に簡単です。に依存関係プロパティを登録しますTextPropertyUserControl1このプロパティは文字列型で、既定値は "" です (プロパティ メタデータに記載されています)。プロパティが変更された後に追加の手順を実行する場合は、静的なコールバック ハンドラーも用意しました。

次に、Text プロパティがGetValue()およびSetValue()メソッドを使用して、Text プロパティの値を取得および設定することがわかります。

更新: XAML の子要素へのバインド。

この更新は、上記の TextProperty をバインディングに使用する方法を示すためのものです。

Usercontrol1.Xaml. これは UserControl1 の XAML です。

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Label Grid.Column="0" FontWeight="Bold" Content="Text" VerticalAlignment="Center" />
        <TextBox Text="{Binding Text, Mode=TwoWay}" Grid.Column="1" VerticalAlignment="Center" Padding="4" />
    </Grid>
</UserControl>

メイン ウィンドウ ビュー モデル (INotifyPropertyChanged の実装)

public class MainWindowModel : INotifyPropertyChanged
{
    /// <summary>
    /// the text
    /// </summary>
    string myProperty = "This is the default text";

    /// <summary>
    /// Gets \ sets the text
    /// </summary>
    public string MyProperty
    {
        get { return this.myProperty;  }
        set
        {
            if (this.MyProperty != value)
            {
                this.myProperty = value;
                this.OnPropertyChanged("MyProperty");
            }
        }
    }

    /// <summary>
    /// fires the property changed event
    /// </summary>
    /// <param name="propertyName"></param>
    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    /// <summary>
    /// the property changed event
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;
}

MainWindow.Xaml. テキスト プロパティをビュー モデルにバインドする

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ctrl="clr-namespace:WpfApplication1"
        Name="Window1"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <ctrl:MainWindowModel />
    </Window.DataContext>
    <Grid>
        <ctrl:UserControl1 Text="{Binding Path=DataContext.MyProperty, Mode=TwoWay, ElementName=Window1}" />
    </Grid>
</Window>
于 2013-11-13T08:19:17.133 に答える