0

作成されたオブジェクトがあり、モードOneWayToSourceを介してそのオブジェクトのプロパティに明示的にバインドしたいと考えています。ただし、このバインディングはまったく機能していません。また、プログラムが初期化されたとき、ボタンをクリックしたときにのみ入力を検証したいときは、テキストボックスの周りに赤い境界線があります。私の最後の溝の効果は、要素自体にソースを埋め込むことでしたが、そのような運はありませんでした。これが私が持っているものです:

<StackPanel.Resources>
    <my:HoursWorked x:Key="hwViewSource" /> 
</StackPanel.Resources>

<TextBox Style="{StaticResource textBoundStyle}" Name="adminTimeTxtBox">
    <Binding Source="{StaticResource hwViewSource}" Path="Hours" UpdateSourceTrigger="PropertyChanged" Mode="OneWayToSource">
        <Binding.ValidationRules>
            <my:NumberValidationRule ErrorMessage="Please enter a number in hours." />
        </Binding.ValidationRules>
    </Binding>
</TextBox>

HoursWorkedオブジェクトは次のようになります。

//I have omitted a lot of things so it's more readable
public class HoursWorked : INotifyPropertyChanged
{

    private double hours;

    public HoursWorked()
    {
        hours = 0;
    }

    public double Hours
    {
        get { return hours; }
        set 
        {
            if (Hours != value)
            {
                hours = value;
                OnPropertyChanged("Hours");
            }
        }
    }

    #region Databinding
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(String info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
    #endregion
}

ウィンドウが初期化されると、これは私が持っているコードの一部です:

public partial class Blah : Window
{
     private HoursWorked newLog;

public Blah()
{
    InitializeComponent();
    newLog = new HoursWorked();
    adminTimeTxtBox.DataContext = newLog;
}

private void addAdBtn_Click(object sender, RoutedEventArgs e)
{
    AddHours();

}

private void AddHours()
{
    if (emp.UserType.Name == "Admin")
    {
        if(!ValidateElement.HasError(adminTimeTxtBox))
        {
                item.TimeLog.Add(newLog);
                UpdateTotals();
                adminTimeTxtBox.Clear();
        }
         }

    }
}

そして最後にValidateElementは次のようになります。

public static class ValidateElement
{
    public static bool HasError(DependencyObject node)
    {
        bool result = false;
        if (node is TextBox)
        {
            TextBox item = node as TextBox;
            BindingExpression be = item.GetBindingExpression(TextBox.TextProperty);
            be.UpdateSource();
        }
        if (Validation.GetHasError(node))
        {
            // If the dependency object is invalid, and it can receive the focus,
            // set the focus
            if (node is IInputElement) Keyboard.Focus((IInputElement)node);
            result = true;
        }

        return result;

    }
}

正しく検証されますが、プロパティが更新されるかどうかを確認するたびに、更新されません。私は本当にこれについて助けが必要です、どんな助けでも大歓迎です。

4

2 に答える 2

1

HoursWorkedクラスのインスタンスが2つあります。

1つはこのタグを介してリソースに作成され<my:HoursWorked x:Key="hwViewSource" />ますが、次にウィンドウにnewLog = new HoursWorked();を使用して作成します。そして、それをadminTimeTxtBoxのDataContextに設定します...そのため、バインド先の1つ(リソースの1つ)は、更新するもの(ウィンドウ内の1つ)と同じではありません。

バインディングをに変更できます

<Binding Source="{Binding}"...。

そして、リソースで定義されたものは必要ありません。

于 2012-07-30T22:30:26.977 に答える
1

TextBox.Textプロパティは文字列型で、Hoursプロパティはdoubleです。

ValueConverter文字列をdoubleに、またはその逆に解析するために、または補助プロパティを作成する必要があります。

于 2012-07-30T22:37:39.150 に答える