1

スライダーとボタンを持つ非常に単純な WPF アプリケーションがあります。クラスのプロパティの 1 つをスライダーの値にバインドし、ボタンがクリックされるたびにメッセージ ボックスに値を表示しようとしています。

Player クラスに BattingForm というプロパティがあります

<Window.Resources>

    <local:Player x:Key="_batsman" x:Name="_batsman"
                  BattingForm="{Binding Path=Value, ElementName=Form}">
    </local:Player>

</Window.Resources>

<Slider Maximum="1" LargeChange="0.25" Value="0.25" Name="Form"/>

そして、Player クラス内では、プロパティは次のようになります。

    public double BattingForm
    {
        get { return (double)GetValue(BattingFormProperty); }
        set { SetValue(BattingFormProperty, value); }
    }

    public static readonly DependencyProperty BattingFormProperty =
        DependencyProperty.Register("BattingForm", typeof(double), typeof(Player));

そして、ボタンクリックイベント内のMainWindow.xaml.csで、次のようにアクセスしようとします-

        Player batsman = FindResource("_batsman") as Player;
        if(batsman!=null)
        {
           MessageBox.Show(batsman.BattingForm.ToString());
        }

MessageBox には、Slider の実際の値ではなく、0 のみが表示されます。

4

3 に答える 3

2

Playerコントロールが実際に使用されるまで、データ バインディングは行われません。現在、_batsmanリソースを宣言しただけで、実際には使用していません。

テストのためだけにこれを行っていると言ったように、最も簡単なことは、次Playerのように XAML で使用できる基本クラスから派生させることControlです。

public class Player : Control

次に、XAML でこれを行うことができます。

<StackPanel>
    <Slider Maximum="1" LargeChange="0.25" Value="0.25" Name="Form"/>

    <local:Player x:Name="_batsman"
                  BattingForm="{Binding Path=Value, ElementName=Form}" />
</StackPanel>
于 2013-05-25T20:50:18.553 に答える
2

Player リソースの代わりに Slider でバインディングを簡単に宣言できます。

<Window.Resources>
    <local:Player x:Key="batsman" BattingForm="0.25"/>
</Window.Resources>
<Grid>
    <Slider Maximum="1" LargeChange="0.25"
            Value="{Binding BattingForm, Source={StaticResource batsman}}"/>
</Grid>

これが機能するValueのは、Slider のプロパティが既定で双方向にバインドされるためです。それができない場合は、TwoWay モードを明示的に設定する必要があります。

<Slider Maximum="1" LargeChange="0.25"
        Value="{Binding BattingForm, Source={StaticResource batsman}, Mode=TwoWay}"/>
于 2013-05-25T20:50:29.693 に答える
2

バインディングを逆にしてみてください:

<Window.Resources>
    <local:Player x:Key="_batsman" BattingForm="0.25" />
</Window.Resources>
<Grid>
    <StackPanel>
        <Slider Maximum="1.0" LargeChange="0.25" Value="{Binding BattingForm, Source={StaticResource _batsman}}" />
        <!-- Included for testing -->
        <TextBox Text="{Binding BattingForm, Source={StaticResource _batsman}}" />
    </StackPanel>
</Grid>
于 2013-05-25T20:58:01.563 に答える