1

私はWPF開発の初心者です。内側にフレームのあるウィンドウをいくつか作成します。フレームのテンプレートを作成しましたが、フレーム テンプレート コマンド内のボタンにバインドしようとしていますが、成功していません。

次のコードを参照してください。

    <Grid.Resources>
<ControlTemplate TargetType="Frame" x:Key="NavigationButtonsTemplates">
                <DockPanel>
                    <StackPanel 
            Margin="7"
            Orientation="Horizontal"
            DockPanel.Dock="Bottom"
            HorizontalAlignment="Right"
            >
                        <Button 
                Content="Back" 
                Command="{x:Static NavigationCommands.BrowseBack}"  
                Margin="5,0,5,0" Width="80" />

                        <Button 
                Content="Next" 
                Command="{Binding Path=NavigateToPersonalDataCommand}"
                Margin="5,0,5,0" Width="80"></Button>
                    </StackPanel>
                    <Border 
            BorderBrush="LightBlue"
            Margin="7,8,9,0"
            BorderThickness="7"
            Padding="5"
            CornerRadius="7"
            Background="White"
            >
                        <ContentPresenter />
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Grid.Resources>

ボタンのバインドが機能していないようです。ボタンをタグの外側に配置すると、完全に機能します。にあるボタンにコマンドをバインドするにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

ControlTemplate必要DataContextです。テンプレート化されたフレームのプロパティにDockPanelバインドするように要素を変更してみてください。これは、テンプレート化されている に有効な があることをDataContext前提としています。FrameDataContext

<DockPanel DataContext="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}">

また

<DockPanel DataContext="{TemplateBinding DataContext}">

編集:

コードを実行しようとした後、問題が見つかりました。XAML でバインドしているプロパティが、ビュー モデルのプロパティと一致しません。

ビュー モデルのプロパティ名にバインドするように XAML を変更すると、問題が解決します。

これから:

Command="{Binding Path=NavigateNext}"
Command="{Binding Path=NavigateToPersonalData}"

これに:

Command="{Binding Path=BrowseNext}"
Command="{Binding Path=NavigateToPersonalDataCommand}"

ビューモデルのプロパティに一致させるには:

public ICommand BrowseNext
{
    get
    {
        return m_BrowseNext;
    }
    set
    {
        m_BrowseNext = value;
    }
}

public ICommand NavigateToPersonalDataCommand
{
    get
    {
        return m_PersonalDataCommand;
    }
    set
    {
        m_PersonalDataCommand = value;
    }
}
于 2012-09-12T13:50:37.213 に答える
0

これは Xaml コードです。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestProj"
    x:Class="TestProj.MainView"
    x:Name="Window"
    Title="MainView"
    Width="640" Height="480">
    <Window.DataContext>
        <local:NavigationViewModel/>
    </Window.DataContext>

    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="0.25*"/>
            <RowDefinition Height="0.25*"/>
            <RowDefinition Height="0.25*"/>
            <RowDefinition Height="0.25*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.20*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Grid.Resources>
            <ControlTemplate TargetType="Frame" x:Key="NavigationButtonsTemplates">
                <DockPanel DataContext="{TemplateBinding DataContext}">
                    <StackPanel 
            Margin="7"
            Orientation="Horizontal"
            DockPanel.Dock="Bottom"
            HorizontalAlignment="Right"
            >
              <Button 
                Content="Back" 
                Command="{Binding Path=NavigateNext}"
                Margin="5,0,5,0" Width="80" />

                        <Button 
                Content="Next" 
                Command="{Binding Path=NavigateToPersonalData}"

                Margin="5,0,5,0" Width="80"></Button>
                    </StackPanel>
                    <Border 
            BorderBrush="LightBlue"
            Margin="7,8,9,0"
            BorderThickness="7"
            Padding="5"
            CornerRadius="7"
            Background="White"
            >
                        <ContentPresenter />
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Grid.Resources>

        <Button Content="Opening" Grid.Row="0"></Button>
            <Button Content="Personal Data" Grid.Row="1"></Button>
        <Button Content="Business Data" Grid.Row="2"> </Button>
        <Button Content="Summery Report" Grid.Row="3"></Button>

        <DockPanel Grid.Column="2" Grid.RowSpan="4">
            <Frame x:Name="mainFrame" Template="{StaticResource NavigationButtonsTemplates}"/>

        </DockPanel>
    </Grid>
</Window>

ここで私はどのようにコマンドを書きましたか:

class NavigationViewModel
    {
        private ICommand m_BrowseNext;
        public ICommand BrowseNext
        {
            get
            {
                return m_BrowseNext;
            }
            set
            {
                m_BrowseNext = value;
            }
        }

        private ICommand m_PersonalDataCommand;
        public ICommand NavigateToPersonalDataCommand
        {
            get
            {
                return m_PersonalDataCommand;
            }
            set
            {
                m_PersonalDataCommand = value;
            }
        }

        public NavigationViewModel()
        {
            BrowseNext = new RelayCommand(new Action<object>(NavigateNext));
            NavigateToPersonalDataCommand = new RelayCommand(new Action<object>(NavigateToPersonalData));
        }


        public void NavigateToPersonalData(object obj)
        {
            MainView.Instance.GetMainFrame.Navigate(Pages.Opening.Instance);
        }

        public void NavigateNext(object obj)
        {
            MainView.Instance.GetMainFrame.Navigate(Pages.PersonalData.Instance);
        }
   }

ボタンをコマンドの外に移動すると、うまく機能するので、問題は XAML にあると思います。

ありがとう!!!

于 2012-09-13T19:10:34.913 に答える