0

次のXamlを使用したMyUserControlがあります。

<TextBox Text="{Binding InputValueProperty}" />

MyUserControl.xaml.csには、次のものがあります。

public string InputValue
{
    get { return (string)GetValue(InputValueProperty); }
    set { SetValue(InputValueProperty, value); }
}
public static readonly DependencyProperty InputValueProperty = 
    DependencyProperty.Register("InputValueProperty", typeof(string), 
    typeof(MyUserControl));

MainWindow.xamlで、ユーザーコントロールを作成します。

<local:MyUserControl InputValue="My Input" />

後でMainWindow.xaml.csで、この文字列にアクセスしようとしています。MyUserControlのすべてのインスタンスはリストに含まれており、foreachを使用してそれらにアクセスします。

string temp = userControl.InputValue;

これは常にnullです。MainWindow.xamlで、ユーザーコントロールのテキストボックスに「入力」が表示されますが、そこから取得できないようです。

4

3 に答える 3

4
DependencyProperty.Register("InputValueProperty", ...

それは次のようになります。

DependencyProperty.Register("InputValue", ...

XAMLは、プロパティアクセサーの名前ではなく、プロパティの登録名に依存します。

于 2012-10-31T16:04:36.617 に答える
0

問題はバインディングにあるようです。相対ソースバインディングを使用してコードをモデル化した実際の例を次に示します。

ユーザーコントロールは次のとおりです。

  public partial class MyUserControl : UserControl
  {
    public MyUserControl()
    {
      InitializeComponent();
    }

    public string InputValue
    {
      get { return (string)GetValue(InputValueProperty); }
      set { SetValue(InputValueProperty, value); }
    }
    public static readonly DependencyProperty InputValueProperty =
        DependencyProperty.Register("InputValueProperty", typeof(string),
        typeof(MyUserControl));
  }
<UserControl x:Class="WpfApplication4.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication4" Height="30" Width="300">
    <Grid>
       <TextBox Text="{Binding Path=InputValue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyUserControl}}}" />
    </Grid>
</UserControl>

そして、ここにウィンドウがあります:

  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
      string text1 = ctrl1.InputValue;
      string text2 = ctrl2.InputValue;
      string text3 = ctrl3.InputValue;
//breakpoint here
    }
  }

<Window x:Class="WpfApplication4.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication4" Title="Window1" Height="300" Width="300">
    <Grid>
    <StackPanel>
      <local:MyUserControl x:Name="ctrl1" InputValue="My Input" />
      <local:MyUserControl x:Name="ctrl2" InputValue="2" />
      <local:MyUserControl x:Name="ctrl3" InputValue="3" />
      <Button Click="Button_Click" Height="25" Content="debug"/>
      </StackPanel>
    </Grid>
</Window>

クリックイベントでブレークポイントをスローすると、各コントロールのバインドされた値を確認できます。(これからコピーして貼り付ける場合は、必ずWpfApplication4をプロジェクトの名前に変更してください。

于 2012-10-31T19:46:36.227 に答える
-1

プロパティを持つクラスにINotifyPropertyChangedを実装する必要があります

    public class YourClassThatHasTheInputValuePropertyInIt: INotifyPropertyChanged
    {
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }

            public string InputValue
            {
                get { return (string)GetValue(InputValueProperty); }
                set { SetValue(InputValueProperty, value);
                      NotifyPropertyChanged("InputValue"); }
     }
    }

これにより、バインディングがプロパティを取得できるようになります

于 2012-10-31T16:06:20.577 に答える