DataContext绑定和刷新

时间:2008-11-19 12:14:06

标签: c# wpf data-binding refresh

我的情景是:

我有一个带有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();
}

当我单击“显示”按钮时,将在文本框中显示数据库中的值,如果用户更改了文本框值,则重新加载窗口时将显示新值而不是旧值。有人可以建议如何再次重新加载值并清除内存对象吗?

5 个答案:

答案 0 :(得分:4)

Binding有两种方式:它取值并在文本框中设置它是可编辑的,如果值改变,它会更新原始对象的值......

如果您只想显示数据,可以使用Binding

中的Mode = OneTime选项
{Binding Path =val1, Mode=OneTime}

这只会评估一次数据..

如果确实需要修改数据,请确保为数据源属性克隆或使用其他对象。这样就可以丢弃数据源对象(如果不再需要它)...

HTH

答案 1 :(得分:0)

我建议将一些代码放入你的取消按钮点击事件,以检查是否有任何数据已从最初加载的内容中更改,因为我假设如果他们没有单击取消,则另一个按钮将保存/确定意味着数据将被提交到数据库。

什么是coll?

如果它是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,请告诉我您正在使用的内容,并且看看我是否可以提供进一步的帮助。

答案 2 :(得分:0)

很抱歉只是为了澄清您从数据库加载集合的所有内容并填充文本框,然后用户可以修改这些值,这取决于他们是单击save / ok还是取消将分别保存或不保存更改。如果是这种情况,那么我会使用arcturus的解决方案。

我使用了我的解决方案,因为我们创建了自己的'typed'数据集,它实现了IEnumerable,使生活更轻松,而不是继续填充集合。虽然我开始希望我们使用LINQ。

答案 3 :(得分:0)

我是这样做的 - &gt;添加了一个更多的文本框,用对象的ID绑定它(只有一个对象应该在那里,因为我只有一个记录存储我的所有设置),并使用,Mode = OneTime用于所有绑定.....所以如果用户保存它将更新现有的object.Cancel现在可以工作..................... whew!

答案 4 :(得分: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>