Bindingでxamlに値を反映させる


```xml:MainWindow.xaml
<Grid>
    <StackPanel Orientation="Vertical" Width="300" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20, 0, 0, 0">

        <!--Bottunクリックすると表示-->
        <TextBlock Text="{Binding PId}"/>
        <!--今日の日付-->
        <TextBlock Text ="{Binding dayTime, StringFormat={}{0:yyyy年MM月dd日}}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        
        <!--IDを取得するテキストボックス-->
        <StackPanel Orientation="Horizontal" Margin="0, 0, 0, 15" >
            <!--Machinesクラスを指定-->
            <ListBox ItemsSource="{Binding Machines}">
                <!--1行ずつをどうやって描画するか定義-->
                <ItemsControl.ItemTemplate>
                    <!--おまじない-->
                    <DataTemplate>
                        <!--2行以上表示させる場合はStackPanelで囲む-->
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Id,StringFormat={}{0:N2}}"/>
                            <TextBlock Text=" "/>
                            <TextBlock Text="{Binding Name,StringFormat=Nameは{0:N0}です}"/>
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ListBox>
        </StackPanel>

        <!--検索ボタン-->
        <Button Click="Button_Click" Height="30" Content="検索" Margin="0, 20, 0, 0" Background="AliceBlue"></Button>

    </StackPanel>
</Grid>
```

```csharp:MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public static string Message = "メッセージ";

    //今日の日付
    public static DateTime? collectStartDate = DateTime.Today;

    ///<summary>
    /// VMクラスを定義する
    ///</summary>
    MainVM myVM = new MainVM();

    //コンストラクタ
    public MainWindow()
    {
        InitializeComponent();

        //VMクラスをxaml側に反映させる
        DataContext = myVM;
    }

    ///<summary>
    /// 検索ボタンを押下したとき発火
    ///</summary>
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        myVM.PId = Message;
        myVM.dayTime = collectStartDate;
    }

}


//VMクラスを定義
public class MainVM : INotifyPropertyChanged
{
    /*MachineクラスのインスタンスをObservableCollectionで定義*/
    private ObservableCollection<Machine> _Machines = new ObservableCollection<Machine>()
    {
        new Machine(){Id=1111, Name="aaa"},
        new Machine(){Id=2222, Name="bbb"}
    };
    /*セッターゲッターを定義*/
    public ObservableCollection<Machine> Machines
    {
        get => _Machines;
        set
        {
            _Machines = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Machines)));
        }
    }

    //ID
    private string _PId;
    public string PId
    {
        get => _PId;
        set
        {
            _PId = value;
            SetProperty(nameof(PId));
        }
    }

    //日付
    private DateTime? _dayTime;
    public DateTime? dayTime
    {
        get => _dayTime;
        set
        {
            _dayTime = value;
            SetProperty(nameof(dayTime));
        }
    }

    //変更通知
    public void SetProperty(string PropertyName)
    {
        var e = new PropertyChangedEventArgs(PropertyName);
        PropertyChanged?.Invoke(this, e);
    }

    //INotifyPropertyChangedに定義されているイベント
    public event PropertyChangedEventHandler PropertyChanged;
}

public class Machine
{
    public int Id { get; set; }
    public string Name { get; set; }
}
```