2

私は前にこれを50回のようにしました。今回はなぜうまくいかないのか本当にわかりません。私は WPF アプリケーションを持っており、唯一の依存関係は MahApps.Metro です。ボタンでMetroWindowとDynamic Styleを使用しています。

最新の xaml は次のとおりです。

    <ItemsControl Grid.Column="0" Grid.Row="1" ItemsSource="{Binding ServerList}" Margin="5">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border Background="LightGray">
                    <StackPanel Orientation="Horizontal">
                        <Button Style="{DynamicResource MetroCircleButtonStyle}" Content="{StaticResource appbar_monitor}" Command="{Binding VM.ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Controls:MetroWindow}}" CommandParameter="{Binding .}"></Button>
                        <Label Content="{Binding .}" HorizontalAlignment="Center" VerticalAlignment="Center"></Label>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

私のViewModelのServerSelectedCommandは次のとおりです。

    private ViewModelCommand _ServerSelectedCommand;
    public ViewModelCommand ServerSelectedCommand
    {
        get
        {
            if (_ServerSelectedCommand == null)
            {
                _ServerSelectedCommand = new ViewModelCommand(
                            p => { SelectServer(p); },
                            p => true
                    );
            }
            return _ServerSelectedCommand;
        }
        set { _ServerSelectedCommand = value; }
    }

    private void SelectServer(object parameter)
    {

    }

ViewModelCommand クラスは RelayCommand のようなものです。ここにあります:

public class ViewModelCommand : Observable, ICommand
{
    public bool CanExecuteValue
    {
        get { return CanExecute(null); }
    }
    public ViewModelCommand(
                Action<object> executeAction,
                Predicate<object> canExecute)
    {

        if (executeAction == null)
            throw new ArgumentNullException("executeAction");

        _executeAction = executeAction;
        _canExecute = canExecute;
    }
    private readonly Predicate<object> _canExecute;
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }
    public event EventHandler CanExecuteChanged;
    public void OnCanExecuteChanged()
    {
        OnPropertyChanged(() => CanExecuteValue);
        if (CanExecuteChanged != null)
            CanExecuteChanged(this, EventArgs.Empty);
    }
    private readonly Action<object> _executeAction;
    public void Execute(object parameter)
    {
        _executeAction(parameter);
    }
}

コード多めですみません。しかし、見えない問題を見つけるためにそれらを追加する必要があります。最初の xaml に戻りましょう。これは私が試した最新のものです。問題のあるボタン行に対して試したコードは次のとおりです。

Command="{Binding ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}"

Command="{Binding ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:ViewModel}}}"

これも何も提供しません!

Command="{Binding RelativeSource={RelativeSource AncestorType=Controls:MetroWindow}}"

ありがとう!

4

1 に答える 1

6

このバインディングは、ItemsControl で ServerSelectedCommand を探しているように見えます。

Command="{Binding ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}"

代わりにこれを試してください:

Command="{Binding DataContext.ServerSelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}"

もちろん、ItemsControl の DataContext が ViewModel であると仮定します。

于 2013-07-03T18:14:10.183 に答える