質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

2回答

10064閲覧

WPFでX, Yのtextboxに値が入っているときだけOKbuttonを押せるようにしたいです。

picko

総合スコア52

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/07/28 05:34

編集2016/07/28 08:36

こんにちは。
X, Yのtextboxに値が入っているときだけOKbuttonを押せるようにしたいです。
Windows10, VisualStudio2015,C#6.0, Livetの組み合わせで開発しています。
MVVMモデルです。

現在のコードです。

TODO
・TextBoxのPropertyChangedを探す、なければ作る。どこにどう作るもの?
・TextBoxのPropertyChangedで、IsOkButtonEnabled の値を変更。

たとえばMVVMでなければ、
<TextBox Text="{Binding XTextBoxText}" x:Name="LocationXTextBox"/>

<TextBox Text="{Binding XTextBoxText}" x:Name="LocationXTextBox" TextChanged="LocationXTextBox_TextChanged"/>
とし、
private void LocationXTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
TextBox textbox = sender as TextBok;
if (!String.IsNullOrEmpty(textbox.Text)) OKbutton.IsEnabled = true;
}
とすればOKと思います。
MVVM(Livet)的な方法をご教示ください。

xaml

1<TextBox Text="{Binding XTextBoxText}" x:Name="LocationXTextBox"/> 2<TextBox Text="{Binding YTextBoxText}" x:Name="LocationYTextBox"/> 3<Button Content="OK" IsEnabled="{Binding IsOkButtonEnabled}"/>

C#

1using System; 2using System.Text; 3using System.Windows; 4 5using Livet; 6using Livet.Commands; 7using Livet.Messaging; 8 9namespace XYWindow 10{ 11 public class CoordinateXYWindowViewModel : ViewModel 12 { 13 public string XTextBoxText { get; set; } 14 15 public string YTextBoxText { get; set; } 16 17 public bool IsOkButtonEnabled { get; set; } 18 19 } 20}

propertyの変更とeventを結びつけるのに、

public string XTextBoxText { get; set { RaisePropertyChanged("XTextBoxText"); } }

としたところ、
abstract, extern または partial に指定されていないため、本体を宣言する必要があります。
となって先に進めずにいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

蛇足ですが
ReactivePropertyを使うと

C#

1public ReactiveProperty<string> XTextBoxText { get; } = new ReactiveProperty<string>(); 2public ReactiveProperty<string> YTextBoxText { get; } = new ReactiveProperty<string>(); 3public ReactiveCommand OkButtonCommand { get; } 4public MainVM() 5{ 6 OkButtonCommand = 7 XTextBoxText 8 .CombineLatest(YTextBoxText, (x, y) => !(string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y))) 9 .ToReactiveCommand(false); 10 11 OkButtonCommand.Subscribe(_ => SomethingToDo()); 12} 13 14private void SomethingToDo() 15{ 16 Console.WriteLine("Hello!"); 17}

のように書けます。

投稿2016/07/29 03:08

編集2016/07/29 03:58
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

TODO
・TextBoxのPropertyChangedを探す、なければ作る。どこにどう作るもの?
・TextBoxのPropertyChangedで、IsOkButtonEnabled の値を変更。

プロパティ変更通知は、(基本的には)ViewModelからViewに対してModelが変更されたことを通知する目的で使用します。
ViewはViewModelの参照を持っていますので、ViewModelに対して変更通知を行う必要はありません。
WPFのMVVMについて、各クラスの関係や役割分担を今一度、整理されることをお勧めします。

実装例の一つとして、ICommandインターフェースを利用する方法があります。
Livetをお使いとのことですので、比較的容易に実装可能です。
Livetでの実装例を以下に示しますが、Livet等のインフラストラクチャを使用せず、
自力で実装する方法も勉強しておきましょう。
(ICommandインターフェースの実装例を示すため、Modelは省略しました)

View

<TextBox Text="{Binding XTextBoxText}" x:Name="LocationXTextBox"/> <TextBox Text="{Binding YTextBoxText}" x:Name="LocationYTextBox"/> <Button Content="OK" Command="{Binding OKCommand}"/>

ViewModel

public class XYWindowViewModel : ViewModel { #region XTextBoxText変更通知プロパティ private string _XTextBoxText; public string XTextBoxText { get { return _XTextBoxText; } set { if (_XTextBoxText == value) return; _XTextBoxText = value; RaisePropertyChanged(); OKCommand.RaiseCanExecuteChanged(); } } #endregion #region YTextBoxText変更通知プロパティ private string _YTextBoxText; public string YTextBoxText { get { return _YTextBoxText; } set { if (_YTextBoxText == value) return; _YTextBoxText = value; RaisePropertyChanged(); OKCommand.RaiseCanExecuteChanged(); } } #endregion #region OKCommand private ViewModelCommand _OKCommand; public ViewModelCommand OKCommand { get { if (_OKCommand == null) { _OKCommand = new ViewModelCommand(OK, CanOK); } return _OKCommand; } } public bool CanOK() { return !string.IsNullOrEmpty(XTextBoxText) && !string.IsNullOrEmpty(YTextBoxText); } public void OK() { // DoSomething } #endregion public void Initialize() { } }

余談ですが、Livetのコードスニペットは利用していますか?
変更通知プロパティであれば、lprop(n)
コマンドであれば、lvcom(n)やllcom(n)
と入力し、Tabキーを押すことで、規定のコードを挿入できます。

投稿2016/07/28 08:59

wakuwaku

総合スコア386

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

picko

2016/07/29 01:22

ありがとうございます。 昨日丸1日かかりましたが、自分で書けました。 setのなかで処理する、というのがわかり、なるほどとひとつ賢くなりました。 コードスニペットアドバイス感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問