3

私のシナリオは次のとおりです。

3 つのデータ バインド テキスト ボックスを含む WPF ウィンドウがあります。

SettingsUI : Window

<Grid Name="SettingsUIGrid1">
    <TextBox Text="{Binding val1}" ....
    <TextBox Text="{Binding val2}" ....
    <TextBox Text="{Binding val3}" ....
</Grid>

コンストラクターでこれを行います:

SettingsUIGrid1.DataContext = coll[0]; // collection first value

[キャンセル] ボタンをクリックすると、ウィンドウが閉じます。

private void btnCancel_Click(object sender, RoutedEventArgs e) {
Close();
}

[表示] ボタンをクリックすると、DB の値がテキスト ボックスに表示されます。ユーザーがテキスト ボックスの値を変更し、ウィンドウをリロードすると、古い値ではなく新しい値が表示されます。誰かが値を再度リロードしてメモリ内オブジェクトをクリアする方法を提案できますか?

4

5 に答える 5

4

バインディングは 2 つの方法で機能します。値を取得してテキスト ボックスで編集可能に設定し、値が変更された場合は元のオブジェクトの値を更新します...

データのみを表示したい場合は、Binding で Mode=OneTime オプションを使用できます。

{Binding Path =val1, Mode=OneTime}

これにより、データが 1 回だけ評価されます。

データを変更する必要がある場合は、クローンを作成するか、データソース プロパティに別のオブジェクトを使用してください。これにより、不要になったデータソース オブジェクトを破棄できます。

HTH

于 2008-11-19T13:05:36.473 に答える
0

データベースからコレクションをロードしてテキストボックスにデータを入力するすべてを明確にするために申し訳ありませんが、ユーザーはこれらの値を変更できます。これらの値は、[保存/確認]または[キャンセル]をクリックするかどうかに応じて、それぞれ変更を保存するかどうかに応じて変更されます。この場合、私はarcturusのソリューションを使用します。

私は自分のソリューションを使用して、コレクションにデータを入力し続けるよりも簡単にするためにIEnumerableを実装した独自の「型指定された」データセットを作成しました。LINQを使用したいと思い始めていますが。

于 2008-11-19T13:30:16.520 に答える
0

データを変更したくない場合は、バインディングを OneWay に設定できます。

<Grid Name="SettingsUIGrid1">
<TextBox Text="{Binding Path =val1, Mode=OneWay}" ....
<TextBox Text="{Binding Path =val2, Mode=OneWay}" ....
<TextBox Text="{Binding Path =val3, Mode=OneWay}" ....
</Grid>
于 2008-11-19T14:01:16.957 に答える
0

私はこのようにしました->テキストボックスをさらに追加し、それをオブジェクトのIDにバインドし(すべての設定を保存するレコードが1つしかないため、オブジェクトは1つだけである必要があります)、すべてのバインディングにMode = OneTimeを使用しました。 ....ユーザーが保存すると、既存のオブジェクトが更新されます。キャンセルが機能するようになりました....

于 2008-11-19T13:46:02.570 に答える
0

キャンセル ボタンのクリック イベントにコードを挿入して、データが最初に読み込まれたものから変更されているかどうかを確認することをお勧めします。データはデータベースにコミットされます。

コルとは?

それがDataTableの場合、これを使用できます:

private static bool DataRowReallyChanged(DataRow row)
    {
        if (row == null)
        {
            return false;
        }

        if (!row.HasVersion(DataRowVersion.Current) || (row.RowState == DataRowState.Unchanged))
        {
            return false;
        }

        foreach (DataColumn c in row.Table.Columns)
        {
            if (row[c, DataRowVersion.Current].ToString() != row[c, DataRowVersion.Original].ToString())
            {
                return true;
            }
        }

        return false;
    }

次に、次のようにキャンセル ボタン イベントに呼び出しを追加します。

if (DataRowReallyChanged((DataRow)SettingsUIGrid1.DataContext))
{
     ((DataRow)SettingsUIGrid1.DataContext).RejectChanges();
}

これが役立つことを願っています。DataTable を使用していない場合は、何を使用しているかお知らせください。さらにお手伝いできるかどうかを確認してください。

于 2008-11-19T13:01:37.543 に答える