1

MVVMのRelayCommandを使用してアクションをXAMLにバインドすることに成功しましたが、ItemsControlに小さな問題があります。

    <ItemsControl ItemsSource="{Binding Devices}" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Width="100" Margin="4" >
                    <Button Command="{Binding Path=SelectDeviceCommand}" >
                        <Grid>
                            <Image Source="img_small.png"></Image>
                            <Image Source="{Binding Path=Logo}" />
                        </Grid>
                    </Button>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

私のビューモデルでは:

    public RelayCommand SelectDeviceCommand { get; set; }
    private ObservableCollection<Device> Devices;

    Devices = CreateListOfDevices();

    private void InitializeCommands()
    {
        SelectDeviceCommand = new RelayCommand((s) => MessageBox.Show(s.ToString()));
    }

そのアイテムにバインドされているオブジェクトを受け取るために、ビューモデルでSelectDeviceCommandを定義するにはどうすればよいですか?

SelectDeviceCommandが呼び出されていません...(ただし、デバイスをミニビューモデルにしてSelectDeviceCommandを実装する必要があるためだと思いますが、それは正しいですか?)

4

3 に答える 3

4

MVVM LightアプリケーションのようにViewModelLocatorを使用する場合は、DataTemplate内からMainViewModelへの参照を次のように取得できます。

<Button Command="{Binding Main.SelectDeviceCommand, Source={StaticResource Locator}}">

この方法はElementNameのものよりもクリーンだと思いますが、もちろん、Mainプロパティがロケーターで使用可能であり、MainviewModelがシングルトンとしてインスタンス化されていることを前提としています。もちろん、これが常に可能であるとは限りません。その場合、ElementNameの回避策は許容できると思います。

WPFでは、Mode = FindAncestorでRelativeSourceを使用することもできますが、さらに面倒です;)

「そのアイテムにバインドされているオブジェクトを受け取るために、ビューモデルでSelectDeviceCommandを定義するにはどうすればよいですか?」という質問に関して、私は質問を理解していると100%確信していませんが、アイテムを取得したい場合は(この場合、DataTemplateで表されるデバイス)、CommandParameterを使用する必要があります。

<Button Command="{Binding Main.SelectDeviceCommand, Source={StaticResource Locator}}"
        CommandParameter="{Binding}"}">

乾杯、ローラン

于 2010-05-11T02:38:14.823 に答える
0

ええ、私はこれを打ちました。ウィンドウにリソースとして追加するカスタムの「CommandReference」クラスを使用して回避する人もいますが、それを機能させることができませんでした。

結局、ViewModelはウィンドウのDataContextであるため、ウィンドウ(またはページ)自体に戻る要素バインディングを使用しました。まず、ウィンドウ(またはページ)に名前を付けます。

<Window ...
    x:Name="me" />

次に、次のように、ウィンドウのデータコンテキストに直接バインドします。

<Button Command="{Binding DataContext.SelectDeviceCommand,ElementName=me}">

これは私のために働いています。散らかっていますが、かなり読みやすいと思います。

于 2010-05-11T01:50:59.403 に答える
0

usercontrol(x:Name = "ControlClass")があり、テンプレート内にありますが、xamlでは機能しません。このように呼び出しました。

<Button Content="New1" Command="{Binding DataContext.NewTabCommand,ElementName=ControlClass}"/>



namespace Doit_Project.Modules.Tasks.ViewModels
{
    [Export]
    public class WindoTabViewModel : Doit_ProjectViewModelBase
    {
        public WindoTabViewModel()
        {

        }

        private RelayCommand _newTabCommand;
        public RelayCommand NewTabCommand
        {
            get { return _newTabCommand ?? (_newTabCommand = new RelayCommand(OnNewTab)); }
        }

        public void OnNewTab()
        {

        }
    }
}
于 2010-05-14T03:13:44.127 に答える