多くのものが含まれているウィジェットを作成し、UCクラス内から更新されているプロパティ(DependencyProperty)を含んでいます(入力がテキストボックスに入力され、ボタンのクリックなど。)その定義は次のとおりです。UserControlのプロパティへのバインド
public partial class UserControlClassName : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public static readonly DependencyProperty ValueProperty = System.Windows.DependencyProperty.Register("Value", typeof(string), typeof(UserControlClassName), new PropertyMetadata(string.Empty, OnValueChanged));
public string Value
{
get { return (string)GetValue(ValueProperty); }
set
{
SetValue(ValueProperty, value);
NotifyPropertyChanged("Value");
}
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && e.NewValue != e.OldValue)
{
Console.Out.WriteLine("new value: " + e.NewValue);
}
}
...
...
lots of other code that updates the Value property..
...
...
}
次のように私はいくつかのウィンドウのXAMLでUCをインスタンス化しています:
<GeneralControls:UserControlClassName
x:Name="someRandomName"
Value="{Binding MyViewModel.MyBoundedValueField, StringFormat=N2, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DebugBinding}}"
VerticalAlignment="Bottom" />
そして絵を完了するためには、これは私はビューモデルのプロパティです値を取得するために使用:
public string MyBoundedValueField
{
get { return myBoundedValueField; }
set
{
if (myBoundedValueField!= value)
{
myBoundedValueField = value;
OnPropertyChanged("MyBoundedValueField");
}
}
}
私の問題は、ユーザーコントロール内が更新されますかValueプロパティをIS-が、私は、XAML(myBoundedValueField)内に結合てる外側プロパティが..バインディングで何かを更新を取得されていませんプロパティはそうworking-されていないこの依存関係に私はこれをデバッグするためのコンバータを取り付け、コンバータは
...その間違いなく間違って結合設定して呼び出されません(助けany1にTNX!)
SourceまたはRelativeSourceを設定せずに 'MyViewModel.MyBoundedValueField'のようなバインディングパスには、UserControlのDataContextまたはその親コントロールの1つにパブリック' MyViewModel'プロパティを持つオブジェクトが必要です。それに加えて、INotifyPropertyChangedを実装することは、依存関係プロパティには必要ありません。だから、あなたのコードから多くの冗長なものを削除することができます。 – Clemens
xaml(ウィジェットのように)で提供する入力バインドフィールドに「アタッチ」できるようにするには、ユーザーコントロールが必要です。DataContextを渡す必要がありますか? – Li3ro
あなたは確かに 'MyViewModel'のインスタンスをUserControlのDataContextに渡し、バインディングパスを{Binding MyBoundedValueField、...}に変更する必要があります。 – Clemens