2

ここに示す例は、実装しようとしている実際のUserControlを単純化したものですが、構造を示しており、同じ問題が発生しています。ユーザーコントロールには、ユーザーコントロールXAMLで定義されているテキストブロックのテキストを設定するDependencyPropertyWordsがあります。

    public partial class MyControl : UserControl
    {
        public static readonly DependencyProperty WordsProperty = DependencyProperty.Register("Words", typeof(string), typeof(MyControl));
        public MyControl()
        {
            InitializeComponent();
        }
        public string Words
        {
            get { return (string)GetValue(WordsProperty); }
            set
            {
                m_TextBlock.Text = value;
                SetValue(WordsProperty, value);
            }

INotifyPropertyChanged ViewModelBaseクラスから派生したViewModelは、mainWindowDataContextに割り当てられます。ModelTextプロパティセットはOnPropertyChangedを呼び出します。

class MainWindow : ViewModelBase
{
    private string m_ModelString;
    public string ModelText
    {
        get { return m_ModelString; }
        set
        {
            m_ModelString = value;
            base.OnPropertyChanged("ModelText");
        }
    }
}

メインウィンドウでは、XAMLバインディングがUserControlとTextBlockに対して行われます。

 <Window x:Class="Binding.View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="218" Width="266" xmlns:my="clr-namespace:Binding.View">
    <Grid>
        <my:MyControl Words="{Binding ModelText}" HorizontalAlignment="Left" Margin="39,29,0,0" x:Name="myControl1" VerticalAlignment="Top" Height="69" Width="179" Background="#FF96FF96" />
        <TextBlock Height="21" HorizontalAlignment="Left" Margin="59,116,0,0" Name="textBlock1" Text="{Binding ModelText}" VerticalAlignment="Top" Width="104" Background="Yellow" />
    </Grid>
</Window>

バインディングはテキストブロックでは機能しますが、ユーザーコントロールでは機能しません。UserControl DependencyPropertyをコントロールプロパティと同じ方法でバインドできないのはなぜですか?

4

2 に答える 2

0

犯人は次のとおりです。

m_TextBlock.Text = value;

WPFは、DPに裏打ちされたプロパティを直接使用しません。

m_TextBlock.Textが変更されたときに更新する場合はWordsProperty、そのテキストブロックをにバインドするか、 in :Wordsを使用します。PropertyChangedCallbackUIPropertyMetadata

 public static readonly DependencyProperty WordsProperty = 
         DependencyProperty.Register("Words", 
                                    typeof(string), 
                                    typeof(MyControl),
                                    new UIPRopertyMetadata(
                 new PropertyChangedCallback(
                     (dpo, dpce) => 
                     {
                         //Probably going to need to first cast dpo to MyControl
                         //And then assign its m_TextBlock property's text.
                         m_TextBlock.Text = dpce.NewValue as string;
                     })));

dpo送信者とdpceイベント引数を検討してください。

于 2012-09-19T13:35:29.177 に答える
0

。ではなく、バインディングによってUserControlのテキストボックスにテキストを割り当てる必要があると思いますm_TextBlock.Text = value;

たぶん、UserControlXamlで次のようなバインディングを使用できます。

    Text="{Binding Words
, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
于 2012-09-19T13:37:17.267 に答える