0

私はできる限りグーグルで検索しましたが、探していたものを正確に見つけることができませんでした。問題はほとんどありません...

これは私のコード構造です:

私のコマンドクラス:

 public class BrowseCommand : ICommand 
 {
   //Code here
 }

ViewModelの内部:

public class ExampleViewModel
{
    public ExampleViewModel()
    {
        BrowseCommand = new BrowseCommand();
    }

    public ICommand BrowseCommand
    {
        get;
        private set;
    }
  //More Code...
}

MainWindow.xaml.cs:

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ExampleViewModel();
    }
}

MainWindow.xaml:

Window x:Class="Ship32RcParser.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" >

   <Grid>
       <Button  Content="Browse" Command="{Binding BrowseCommand}"/>
       <Button  Content="Search" Command="{Binding I_NEED_HELP_HERE}"  />
   </Grid>
</Window>



MainWindow.xaml.csが持っているため、ブラウズが正常に機能することを理解しています

DataContext = new ExampleViewModel();

しかし、私はそれが好きではありません

  1. .csファイルに何も入れたくない
  2. 複数のデータコンテキストを使用するにはどうすればよいですか?つまり、異なるViewModelクラスからのコマンドが必要な場合は...可能性はわかっていますが、少し醜いです...

私が解決策を探していたとき、私は依存関係に出くわしました。たとえば、xamlファイルで次のようなことを行うことができます

xmlns:local="clr-namespace:myMvvMwpfProj.ViewModel"

次に「ローカル」を使用します。でも、やってみたら思った通りに動かなかった…。

xmlns:local="using:myMvvMwpfProj.Command"

誰かがそれらも説明できますか?「ローカル」はクラスへのアクセスを提供しますか?CommandA、CommandB、CommandCクラスがある場合。local:CommandA.ExecuteFooを実行できる必要がありますか?

大きな問題は、さまざまなオブジェクトのプロパティをどのように参照/アクセスするかということだと思います。Xamlで

よろしくお願いします

4

3 に答える 3

8

WPF内は、UIレイヤーのDataContext背後にあるデータレイヤーです。バインディングは、UIレイヤーで使用するためにデータレイヤーからプロパティをクエリするために使用されます。

BrowseCommandUIレイヤーに2つのボタン([参照]と[検索])がある場合は、通常、データレイヤーに2つのコマンドを含める必要があります。SearchCommand

ただし、現在以外のものを照会するバインディングを作成することは可能DataContextです。私は実際にこれについて昨日別のSO回答を書きました。これにはいくつかの例が含まれています。

最も一般的な方法はElementNameまたRelativeSourceはです。これは、VisualTreeで別のUI要素を検索するため、次のようにバインディングのソースとして使用できます。

<Button Command="{Binding ElementName=SomeXAMLObjectName, 
                          Path=DataContext.BrowseCommand}" />

<Button Command="{Binding 
            RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
            Path=DataContext.BrowseCommand}" />

3番目のオプションは、XAMLのでオブジェクトのインスタンスを作成し、次のよう<XXXX.Resources>に、それを使用してソースをそのインスタンスに設定することx:Keyです。

<Window.Resources>
    <local:MyViewModel x:Key="MyViewModelInstance" />
</Window.Resources>

...

<Button Command="{Binding Source={StaticResource MyViewModelInstance}, 
                          Path=BrowseCommand}">

次のように、バインディングのSourceプロパティを静的オブジェクトに設定して、でオブジェクトのインスタンスを作成する必要がないようにすることもできます.Resources

<Button Command="{Binding Source={x:Static local:MyStaticClass.BrowseCommand}}">

ただし、これは静的クラスに対してのみ機能します。これは、バインディング用のオブジェクトの新しいインスタンスを実際には作成しないためです。

あなたが書くとき、あなたの他の質問に答えるために

xmlns:local="clr-namespace:myMvvMwpfProj.ViewModel"

XAMLに「myMvvMwpfProj.ViewModel」(xmlnsはXML名前空間の略)へのショートカットとして「local」を使用するように指示しているので、のようなものlocal:MyStaticClass.BrowseCommandはにバインドすることを意味しmyMvvMwpfProj.ViewModel.MyStaticClass.BrowseCommandます。

WPFとMVVMを初めて使用する場合は、新しいWPF/MVVMユーザー向けに特別に作成したブログ記事をいくつか確認することをお勧めします。

これらは、WPFとMVVMパターンがどのように機能するかをよりよく理解するのに役立ちます。

于 2013-03-20T15:02:04.557 に答える
2

ビューでデータコンテキストを設定できます<Grid DataContext = "{Binding}">

ビューごとに 1 つのビューモデルがありますが、多くのバインドされたコマンドを持つことができます! Josh Smiths RelayCommand を調べることをお勧めします。これにより、これが非常に簡単になります。ガイドはこちら:

新しいクラスを作成する

class RelayCommand : ICommand
{
    private Action<object> _action;

    public RelayCommand(Action<object> action)
    {
        _action = action;
    }

    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
            _action(parameter);
    }

    #endregion
}

そしてあなたのViewModelで

    public ICommand BrowseCommand {get; set;}
    public ICommand SearchCommand {get; set;}

    public ExampleViewModel()
    {
        this.BrowseCommand = new RelayCommand(new action<object>(MethodNameEnteredHere);
        this.SearchCommand = new RelayCommand(new action<object>(OtherMethodNameEnteredHere);
    }

だから、あなたのxamlは

<Grid DataContext = "{Binding}">
       <Button  Content="Browse" Command="{Binding BrowseCommand}"/>
       <Button  Content="Search" Command="{Binding SearchCommand}"  />
 </Grid>
于 2013-03-20T14:47:06.027 に答える
0

ビューでさまざまなビューモデルのオブジェクトを使用する場合は、次のことを行う必要があります。

  1. 使用する他のビュー モデルのメイン ViewModel にいくつかのインスタンスを用意すると、バインディングは {Binding AlternativeViewModelInstance.NewCommand} のようになります。

  2. 異なるデータ コンテキストでバインドが必要なビュー内の領域を特定し、それらを異なるビューとビューモデルの組み合わせに分けます。

于 2013-03-20T14:51:33.810 に答える