wpf DataTrigger值未更新

时间:2016-09-27 08:50:17

标签: c# wpf xaml datatrigger

我正在尝试制作一个简单的Unity Standalone构建启动器(用于街机柜) - 设置非常简单 - 操纵杆上下突出显示游戏(在这种情况下,更改矩形的填充颜色和button1 lauches the正确的游戏。 我愚蠢地认为我可以在wpf中做到这一点,但是在第一道障碍中跌跌撞撞。

我有键盘输入(街机操纵杆通过i-pac2设置)工作(主窗口的焦点锁定)并且正在改变0-6之间的整数。这通过MainWindow上的代码工作(欢呼)并传递给名为 position 的静态int。

然后我打算有一系列基于这个int值突出显示的矩形。 我一直在测试一个矩形 - 使用dataTrigger来实现状态的改变 - 但它不会在键盘输入上更新。 代码剪......

  <Rectangle x:Name="gameRect01" Height="74" Margin="10,93,32.667,0" VerticalAlignment="Top" Grid.ColumnSpan="2" IsEnabled="False">
        <Rectangle.DataContext>
            <local:Launcher/>
        </Rectangle.DataContext>
        <Rectangle.Style>
            <Style TargetType="Rectangle">
                <Setter Property="Fill" Value="Red" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path = cursorPos, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Value="1">
                        <Setter Property="Fill" Value="Green" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Rectangle.Style>

和Launcher类......

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.ComponentModel;

    namespace GameLauncher 
    {
      class Launcher : INotifyPropertyChanged
      {
        public static int position = 0;

    public int cursorPos
    {
        get 
        { return position; 
        }
        set
        {
            cursorPos = position;
            RaisePropertyChanged("cursorPos");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

}

XAML代码似乎与 cursorPos 绑定 - 如果我更改了绑定中的值,则矩形会更改填充。

键盘输入肯定会改变 position 的值,但 cursorPos 中的值不会更新。

我觉得我错过了一些非常简单的东西,却找不到任何有用的东西(我一直在寻找和尝试过去3晚没有运气的修改)。我非常感谢有新人的一些指示。

谢谢, 彼得

更新 我已经根据以下反馈更新了Launcher ......

namespace GameLauncher 
{
class Launcher : INotifyPropertyChanged
{
    private int _position;

    public int cursorPos
    {
        get {
            return _position;
        }
        set {
            _position = value;
            RaisePropertyChanged(nameof(cursorPos));
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

我的键盘输入代码如下所示......

namespace GameLauncher
{ 
public partial class MainWindow : Window
{
    Launcher launcher = new Launcher();
    private string gameGet;


    public MainWindow()
    {
        InitializeComponent();
        this.KeyDown += new KeyEventHandler(OnButtonKeyDown);

    }

    public void OnButtonKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Down || e.Key == Key.F) {
            launcher.cursorPos =  Math.Min(6, launcher.cursorPos + 1); Debug.WriteLine(launcher.cursorPos);
        }

        if (e.Key == Key.Up || e.Key == Key.R) {
            launcher.cursorPos = Math.Max(0, launcher.cursorPos - 1); Debug.WriteLine(launcher.cursorPos);
        }

        if (e.Key == Key.LeftCtrl || e.Key == Key.LeftAlt || e.Key == Key.A || e.Key == Key.S || e.Key == Key.D1 || e.Key == Key.D2){
         //   gameGet = "testGame";
        }

    }

    private void PlayButton_Click(object sender, RoutedEventArgs e)
    {
      //  Launcher.PlayGame("test");
    }
}

}

XAML代码是相同的,但它没有更新 - gah。我现在唯一能想到的是,通过实例化Launcher类来调用MainWindow是不正确的,我应该以另一种方式做到这一点?

1 个答案:

答案 0 :(得分:0)

一般来说,最好将您的字段设为私有,并通过属性进行访问:

<?php
session_start();

$_SESSION["name-error"] = "Error";
echo "ERROR";


success : function(data){
    if(data = "Error")
    {

    }
}

应该是

 public static int position = 0;

我评论静态,因为只有在真正需要的时候才应该使用它。

将所有 private /*static*/ int position = 0; 替换为position = ...;。如果你比我聪明,你甚至可以为它编写RegEx并让IDE完成你的工作; - )

另一点是,如果您使用C#6.0 cursorPos = ...;,则可以使用nameof关键字来更改属性。如果您有一天重命名您的房产,这将使您更加头痛。

修改

RaisePropertyChanged(nameof(cursorPos));