1

私は WPF の初心者です。WPF ウィンドウがあり、同じプロジェクトに WPF ページがあります。ページには、ウィンドウに読み込まれるキーボード レイアウトが含まれています。ウィンドウには、ソースがページに設定されているフレームがあります。ページ内のすべてのボタンは WPF カスタム コントロールです。これらのコントロールには、IsCapsOn と IsShiftOn のような 2 つの依存関係プロパティがあります。これらの依存関係プロパティを変更すると、ボタンのテキストが変更されます (「a」は、キャップが押されたことを示す「A」になります)。上記の依存関係プロパティは、IsCapsPressed および IsShiftPressed という名前でメインウィンドウの依存関係プロパティにバインドされます。ユーザーがメインウィンドウで Caps キーを押すと、IsCapsPressed プロパティがバックエンドで変更され、その結果 IsCapsOn もバインディングのために変更する必要があります。

 //page
<Page x:Class="Philips.PmsUS.VirtualKeyboard.Resources.Layouts.USKeyboardPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:kb="clr-namespace:Philips.PmsUS.KeyboardButton;assembly=Philips.PmsUS.KeyboardButton"
      mc:Ignorable="d"
      x:Name="Layout"
      Loaded="Page_Loaded"      
      Title="USKeyboardPage">    
    <Grid x:Name="MainGrid"
          Width="auto"
          Height="auto"
          Focusable="True">
    <!...Row and column definitions are defined...>
     <kb:KeyboardButton Name="Button_Q"
                               Width="auto"
                               Height="auto"
                               Grid.Column="3"                               
                               IsCapsOn="{Binding Path=IsCapsPressed}"
                               IsShiftOn="{Binding Path=IsShiftPressed}"
                               Focusable="True"
                               Style="{StaticResource KeyboardButtonStyle}"
                               Click="NonModifierClick"
                               DataContext="{Binding ElementName=Keyboardwnd}"></kb:KeyboardButton>        
    </Grid>
<page>

//window.xaml
<Window x:Class="Philips.PmsUS.VirtualKeyboard.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"               
        Title="KeyboardWindow"
        x:Name="Keyboardwnd"        
        Height="581"
        Width="1392"
        Topmost="False"
        Loaded="Window_Loaded"
        FocusManager.IsFocusScope="True"
        WindowStartupLocation="Manual"
        Background="{DynamicResource KeyboardBackgroundBrush}">   
    <Grid x:Name="LayoutRoot">
        <Frame x:Name="LayoutHolder"
               Source="Resources\Layouts\USKeyboardPage.xaml"
               ></Frame>            
    </Grid>
  </Window>

//mainwindow.xaml.cs
#region dependency properties
        //the below dependency properties are used for modifier keys
        public static readonly DependencyProperty IsCapsPressedProperty = DependencyProperty.Register("IsCapsPressed", typeof(bool), typeof(MainWindow), new FrameworkPropertyMetadata(new PropertyChangedCallback(SetCapsState)));
        public static readonly DependencyProperty IsShiftPressedProperty = DependencyProperty.Register("IsShiftPressed", typeof(bool), typeof(MainWindow), new FrameworkPropertyMetadata(new PropertyChangedCallback(SetShiftState)));
        public static readonly DependencyProperty IsGlobePressedProperty = DependencyProperty.Register("IsGlobePressed", typeof(bool), typeof(MainWindow), new FrameworkPropertyMetadata(new PropertyChangedCallback(SetGlobeState)));
        #endregion

しかし、上記のデータ コンテキスト バインディングが機能していません。助けてください。

4

4 に答える 4

0

mvvmを使用していないと思いますか?mvvm の一般的な問題は、ビューモデル (ビューがバインドするデータを効果的に保持する) 間の通信です。この問題の一般的な解決策の 1 つは、mvvm light に含まれているようなメッセージング サービスを使用して、何らかの値が更新されたこと、アクションが実行されたことなどを示すメッセージを投稿することです。それについて知ることに関心のある他のビューは、メッセージをサブスクライブし、それが受信されたときにローカルで値を更新できます。

コード ビハインドでメッセージを投稿およびサブスクライブできなかった理由はわかりません。メッセージング サービスが必要なだけです。

于 2013-08-30T15:00:31.103 に答える