10

演習として、WPFで自転車用ギア計算機を作成することにしました。トリガーするセッターを使用して2つのプライベートフィールドを作成しましたが、動的に計算されるため、「読み取り専用」として動作するOnPropertyChanged()1つのデータバインドプロパティがあります。ratioプログラムを実行すると、テキストボックスが表示され、初期値が正しく表示され、プロパティ変更ハンドラーの「動作中」の単語が表示されますが、ratioTextBlockは更新されません。

これはプロパティの「取得」方法によるものと思われます。すべてにプライベートフィールドを追加する必要があるのではないかと思います。これにDependencyPropertyがあるべきではないかと思います...しかし実際には私はこれに関する知識の限界であり、この些細なプログラムを機能させることはできません。


これは私のモデルです:

class SingleGearsetModel : INotifyPropertyChanged
{
    public SingleGearsetModel()
    {
        crank = 44;
        cog = 16;
    }

    private int _crank;
    private int _cog;

    public int crank { 
        get{return _crank;}
        set{
            _crank = value;
            OnPropertyChanged("crank");
        }
    }

    public int cog {
        get{return _cog;}
        set{
            _cog = value;
            OnPropertyChanged("cog");
        } 
    }

    public double ratio
    {
        get {
            return (double)crank / (double)cog;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string arg)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(arg));
            Console.Writeline("working");
        }
    }

} // end class

これは私のXAMLです:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="CalculadorFixaWPF.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">

    <DockPanel x:Name="LayoutRoot">
            <TextBox Text="{Binding crank, Mode=TwoWay}"/>
            <TextBox Text="{Binding cog, Mode=TwoWay}"/>
            <TextBlock Text="{Binding ratio, StringFormat={}{0:0.00}}"/>
    </DockPanel>
</Window>

そして、これは私のコードビハインド(MainWindow.xaml.cs)にあります:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
        this.DataContext = new SingleGearsetModel();
    }
}

読んでくれてありがとう!

4

2 に答える 2

13

比率は計算フィールドであるため、値が変更される可能性があるたびに通知を追加する必要があります。これは、crankまたはcogが変更された場合に発生します。

したがって、変更されたことを通知した後、変更されたことも通知しratioます。

public int crank 
{ 
    get{return _crank;}
    set{
        _crank = value;
        OnPropertyChanged("crank");

        // *** Notify that ratio has also been changed ***
        OnPropertyChanged("ratio");
    }
}

同じことがcog

編集: あなたのコメントに基づいて、クラス内からPropertyChangedイベントに登録し、比率のPropertyChangedを上げる方法は次のとおりです。

// Constructor
public SingleGearsetModel()
{
    ....
   PropertyChanged += SingleGearsetModel_PropertyChanged;
}

// PropertyChanged event handler
void SingleGearsetModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
        if (e.PropertyName == "cog" || e.PropertyName == "crank")
        {
            OnPropertyChanged("ratio");
        }
}

このアプローチを使用すると、プロパティのセッターの内部を追加する必要はありませんOnPropertyChanged("ratio")。プロパティが発生するたびに、イベント(in SingleGearsetModel_PropertyChanged)を取得して、プロパティを発生させます。OnPropertyChanged("ratio")

于 2013-01-29T19:09:26.333 に答える
2

最も簡単な方法は、とOnPropertyChanged("ratio")の両方のセッターに追加することです。イベントをリッスンし、どちらかが変更された場合は自動的に起動するという方針に沿って、より洗練された処理を実行できますが、少なくともこれで問題は解決します。crankcogOnPropertyChangedcrankcogOnPropertyChanged("ratio")

于 2013-01-29T19:09:31.993 に答える