0

UserControl にデータを入力する IPluginsProvider インターフェイスがある MVVM プラクティスを使用して構築した ActionsTreeView という UserControl があります。IContentProviderこのインターフェイスを実装するオブジェクトをパラメーターとして提供して、UserControl の ViewModel を初期化できるようにしたいと考えています。

これまでの私のアプローチは次のとおりですが、うまくいきません。私は正しい道を進んでいるかどうか疑問に思っていますか?DependencyPropertyこの UserControl をインスタンス化する mainWindow に表示されるユーザー コントロールでを宣言します。このコードは、PluginsProvider オブジェクトを、ViewModel を構築するために必要な UserControl に渡そうとするだけです。

My handler が MainWindow.xaml.cs で常に null であるため、UserControl の PluginProviderDependencyPropertyセッターがヒットすることはPropertyChangedありません繋がり?

ActionsTreeView.xaml.cs

public partial class ActionsTreeView: UserControl
{
    public static readonly DependencyProperty PluginProviderProperty = DependencyProperty.Register("PluginProvider", typeof(Models.IPluginsProvider), typeof(ActionsTreeView), new FrameworkPropertyMetadata(null, OnPluginProviderChanged));

    private ViewModels.ActionsTreeViewModel vm;

    public ActionsTreeView()
    {
        //Wire-up our ViewModel with the data provider and bind it to DataContext for our user control
        //This is a Mock-up until I figure out a way to get the real provider here

        Models.IPluginProvider pluginSource = new Models.MockPluginProvider();

        vm = new ViewModels.ActionsTreeViewModel(pluginSource );
        this.DataContext = vm;

        InitializeComponent();
    }

    private static void OnPluginProviderChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        ((ActionsTreeView)source).PluginProvider = (Models.IPluginsProvider)e.NewValue;
    }

    public Models.IPluginsProvider PluginProvider 
    {
        get
        { 
            return (Models.IPluginsProvider)GetValue(PluginProviderProperty);
        }

        set 
        { 
            SetValue(PluginProviderProperty, value); 
            vm.SetPluginSource(PluginProvider);
        } 
    }...

MainWindow.xaml.cs

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public MainWindow()
    {
        InitializeComponent();

        this.ActionProvider = new Models.PluginsProvider(Library.Action.AvailableActions);
    }

    private Models.IPluginsProvider _actionProvider;
    public Models.IPluginsProvider ActionProvider
    {
        get { return _actionProvider; }
        set 
        { 
            _actionProvider = value;
            OnPropertyChanged("ActionProvider");
        }
    }
    protected void OnPropertyChanged(string property)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)  //HANDLER IS ALWAYS NULL
        {
            handler(this, new PropertyChangedEventArgs(property));
        }
    }
}

MainWindow.xaml での UserControl の使用

<Grid>

    <UserControls:ActionsTreeView PluginProvider="{Binding ActionProvider}" />

</Grid>
4

2 に答える 2

1

xaml の ctor にパラメーターを渡すことはできないと思います。

コード ビハインドでコントロールを作成する場合は、ctor(Param param) でパラメーターを渡すことができます。

これがMVVMモデルに適合するかどうかはわかりませんが、通常のコードビハインドでよく使用します

UserControl を配置する場所として、XAML でフレームを使用します。

于 2012-10-05T16:39:54.367 に答える