午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

WPFにもNumericUpDownみたいなのをユーザーコントロールで、その9、不具合修正

ダウンロード先

github.com ここのControlLibraryCore20200620_v1.2.2.zip


作成動作環境

動作に必要なのは.NET Core 3.1がインストール済みのWindowsで、.NET Frameworkだけでは動かないはず


不具合修正
MyValueとBindingしている値が、MyMinValue(下限値)やMyMaxValue(上限値)を超えてしまうことがあるのを修正した


確認

MainWindow.xaml

<Window x:Class="_20210331_NumericUpDown9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_20210331_NumericUpDown9"
        xmlns:UpDown="clr-namespace:ControlLibraryCore20200620;assembly=ControlLibraryCore20200620"
        mc:Ignorable="d"
        Title="MainWindow" Height="250" Width="400">
    <Grid>
    <StackPanel>
      <UpDown:NumericUpDown MyMaxValue="100"
                            MyValue="{Binding Path=Value}"
                            Name="MyUpDown"
                            MySmallChange="1" MyLargeChange="10"
                            FontSize="40" HorizontalAlignment="Center"
                            MyStringFormat="MyValue = 000"/>
      <TextBlock Text="{Binding ElementName=MyUpDown, Path=MyValue}"
                 FontSize="40" HorizontalAlignment="Center"/>
      <TextBlock Text="{Binding Path=Value}"
                 FontSize="40" HorizontalAlignment="Center"/>
      <Button x:Name="MyButton" Content="test" Click="MyButton_Click"/>
    </StackPanel>
    </Grid>
</Window>

f:id:gogowaten:20210401085508p:plain
上限値を100に指定、MyValueをValueとBinding

f:id:gogowaten:20210401085624p:plain
2つのTextBlockは確認用、上はNumericUpDownのMyValueを表示、下はValueを表示



MainWindow.xaml.cs

using System.Windows;

namespace _20210331_NumericUpDown9
{
    public partial class MainWindow : Window
    {
        private Data MyData = new();
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = MyData;
        }

        private void MyButton_Click(object sender, RoutedEventArgs e)
        {
            var inu = MyUpDown.MyValue;
            var neko = MyData.Value;
        }
    }


    public class Data
    {
        public decimal Value { get; set; } = 100m;
    }
}

f:id:gogowaten:20210401085852p:plain
Bindingする値Valueを持ったDataクラス

f:id:gogowaten:20210401085935p:plain
DataクラスをDataContextにしてBinding


旧バージョン

これを動かすと
f:id:gogowaten:20210401090630p:plain
初期値は100なので、ぜんぶ100

ここから▲を押して値を増やそうとすると
f:id:gogowaten:20210401090735p:plain
MyValue自体は上限値の100のままだけど、それとBindingしているValueのほうは上限値を超えて101になった

中の変数を見ても
f:id:gogowaten:20210401091030p:plain
101になってしまっている


今バージョン

この不具合を直したのが今回のバージョン1.2.2

f:id:gogowaten:20210401091534g:plain
1.2.2
期待通りの動作!


書き換えた場所

UserControl1.xaml.cs
f:id:gogowaten:20210401093413p:plain
MyValueプロパティのSetのところで上限下限をチェックするようにしただけ、これで直ったんだけど、MyValueはDependencyPropertyにしいるので、その Registerの
f:id:gogowaten:20210401094141p:plain
これ(179行目~)
よくわからんけど値変更直前に実行されるCoerceってところ

f:id:gogowaten:20210401093621p:plain
ここ(227行目~)でチェックしてるから、Setのところでは必要ないと思っていたんだよねえ、実際はこれだけだと上限下限を超えてしまっていたので不十分だった


感想

要素同士のBindingだと正常で、DataContextでBindingした場合には不具合になるとかで今まで気づかなかったけど、直せてよかったわ






関連記事
導入手順と履歴リンク
gogowaten.hatenablog.com

次回のWPF関連記事は1日後
gogowaten.hatenablog.com

前回のWPF記事は3日前
gogowaten.hatenablog.com

前回のNumericUpDown
gogowaten.hatenablog.com