1

WPF カスタム コントロールにいくつか問題があります。機能させようとしていますが、取得できません。

これが私の問題です。TextBox とほぼ同じ単純なカスタム コントロールを作成しています。このコントロールには "Texto" という名前の依存関係プロパティがあり、XAML とカスタム コントロールのバックコードの間のバインディングは正常に機能します。コードは次のとおりです。

<UserControl x:Class="WpfCustomControlLibrary1.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" 
         d:DesignHeight="47" d:DesignWidth="147">
<Grid Height="43" Width="142">
    <TextBox Height="23" HorizontalAlignment="Left" Margin="12,8,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Texto}"/>        
</Grid>

依存関係プロパティのコード:

public static readonly DependencyProperty TextoProperty = DependencyProperty.Register("Texto", typeof(string), typeof(UserControl1));

    public string Texto
    {
        get
        {
            return (string)GetValue(TextoProperty);
        }

        set
        {
            SetValue(TextoProperty, value);
        }
    }

さて、問題は次のとおりです。他のウィンドウでこのコントロールを使用すると、「Texto」プロパティをビューモデルにバインドしようとしますが(他のすべてと同じくらい単純です)、ビューモデルのプロパティは変更されません:

ViewModel コード:

 public class ViewModelTest
{
    public string SomeText { get; set; }
}

アプリケーション ウィンドウのコード:

public ViewModelTest test;

    public Window1()
    {
        InitializeComponent();
    }        

    private void button1_Click_1(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(test.SomeText);
        MessageBox.Show(uc.Texto);
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        test = new ViewModelTest();
        this.DataContext = test;
    }

ビューモデルのプロパティとのバインディング:

<my:UserControl1 HorizontalAlignment="Left" Margin="27,12,0,0" Name="uc" VerticalAlignment="Top" Texto="{Binding Path=SomeText,Mode=TwoWay}"/>

わかりやすくするために、カスタム コントロールに「Hello」と書いてから「button1」を押すと、最初のメッセージには何も表示されず、2 番目のメッセージには「Hello」と表示されます。

ご覧のとおり、私はこれにかなり慣れていないので、あなたの何人かが私を助けてくれることを願っています. ありがとう。

4

1 に答える 1

2

バインディングTexto="{Binding SomeText}"は正常に機能します。問題は、ユーザー コントロールから内部テキスト ボックスへの再バインディングです。バインディングは常に、変更されていない場合は を参照することを忘れないでくださいDataContext。しかし、DataContext にはプロパティ Texto が含まれていません。あなたのコントロールにはそれがあります。それを参照するには、と呼ばれるものが必要ですTemplateBindingが、これは ControlTemplate にいる場合にのみ機能します。あなたはどちらではないので、解決策は何ですか? ソースを DataContext から特定の名前のコントロールに変更することで、特別な形式のバインドを使用できます。まず、UserControl に名前を付けます。

<UserControl x:Class="WpfCustomControlLibrary1.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" 
         x:Name="mainControl"
         d:DesignHeight="47" d:DesignWidth="147">

コントロールの DataContext ではなく、コントロールを参照するようにバインディングを変更します。

 <TextBox Text="{Binding ElementName=mainControl, Path=Texto}"/>

これで、ViewModel がユーザー コントロールにバインドされ、ユーザー コントロールのコンテンツがユーザー コントロールの Texto プロパティにバインドされます。

また、カスタム コントロールと呼ばれるものは、実際にはユーザー コントロールであり、カスタム コントロールは別のものです。

于 2013-01-31T16:47:48.493 に答える