1

UserControl があり、bool プロパティ A が含まれています。その UserControl を含むメイン ウィンドウでは、A の値に応じてボタンを有効/無効にする必要があります。A を公開し、次のようなボタンをバインドしようとしました。

<Button IsEnabled="{Binding MyUserControl.A}"/>

そして、UserControl で、Property A に PropertyChangedEventHandler を次のように設定します。

private bool _a;
public bool A
{
    get
    {
         return _a;
    }
         set
    {
         if (_a == value)
             return
         _a = value;
         OnPropertyChanged("A");
    }
}

きれいに見えます。しかし、なぜそれが機能しないのかわかりません。メインウィンドウとそのユーザーコントロールの間で通信するための実装が不足しているようです(OnPropertyChangedを使用すると、ユーザーコントロール内のすべてのバインディングがうまく機能するため)。

私はそれに対するいくつかの解決策を持っています.1.メッセンジャーを使用して、コンテンツがAの値であるユーザーコントロールからメッセージを送信すると、メインコントロールが値をキャッチしてボタンのIsEnabledに設定します。2. イベントを作成し、A の値が変更されるたびにそれを上げます。

この問題とその修正方法について何か考えはありますか? 以下の 2 つの解決策はうまくいくと思いますか、それとも他に推奨事項はありますか?

読んでくれてありがとう。

<< 編集 >> この問題は解決されました。コードビハインドでユーザーコントロールのデータコンテキストを設定し、データテンプレートで既に設定していることを認識していないのは私の間違いです。--> ということで、usercontrol の viewmodel の初期化を 2 回重複させています。--> どういうわけか、NotifyPropertyChange が正しく動作しません。

申し訳ありませんが、この質問のタイトルはこのばかげた間違いには適していません。タイトルの問題を解決するために正しい道を進んだようです。読んでいただき、アドバイスをいただきありがとうございます。

4

3 に答える 3

2

wpf でユーザー コントロールを表示する別の方法。ここでこのStackOverflowの議論を確認してください

INotifyPropertyChanged の代替: バインディングの依存関係プロパティ。

//ユーザーコントロール

public partial class UserControl1 : UserControl
{
   public bool A
    {
        get { return (bool)GetValue(AProperty); }
        set { SetValue(AProperty, value); }
    }

    public static readonly DependencyProperty AProperty =
        DependencyProperty.Register("A", typeof(bool), typeof(UserControl1), new UIPropertyMetadata(false));

    public UserControl1()
    {
        InitializeComponent();
        DataContext = this;
    }
}

}

//メインウィンドウ.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:src="clr-namespace:WpfApplication1"
      Height="300" Width="300">
    <StackPanel>
      <src:UserControl1 x:Name="myControl" />
      <Button IsEnabled="{Binding A, ElementName=myControl}" />
    </StackPanel>

于 2013-01-15T10:02:56.057 に答える
1

バインディング式は、バインディング パスの評価のベースとして常にDataContextを使用します。したがって、あなたの場合、DataContextウィンドウ自体である必要があります。コード ビハインド ファイルのウィンドウのコンストラクターで設定できます。

this.DataContext = this;

また、ウィンドウを機能させるには、 というプロパティが必要であることに注意してくださいMyUserControl

もう 1 つのオプションは、XAML でインスタンス化した MyUserControl インスタンスに名前を付けてからElementName、バインディング式で使用することです。

<Grid>
    <loc:MyUserControl Name="myUserControl" />
    <Button IsEnabled="{Binding A, ElementName=myUserControl}" />
</Grid>
于 2013-01-15T09:22:58.223 に答える
1

リソースでそれを宣言して UserControl のインスタンスを作成し、それを datacontext に設定すると、それを使用できるようになります。これを試して。

<Window.Resources>
    <WpfApplication2:UserControl1 x:Key="MyUserControl"/>
</Window.Resources>

<StackPanel DataContext="{StaticResource MyUserControl}">
    <Button IsEnabled="{Binding Path=A}" Content="Test" Height="20" />
</StackPanel>
于 2013-01-15T09:41:45.077 に答える