- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到了这个例子 - Binding.UpdateSourceTrigger Property
在示例中,UpdateSourceTrigger 设置为 Explicit,然后在 View 代码中他调用 TextBox 名称的 UpdateSource。
但是,如果我使用 MVVM dp,我不希望我的控件和源属性的名称在 VM 中而不是在 View 中,那么将控件绑定(bind)到 VM 属性并将 UpdateSourceTrigger 设置为显式的正确方法是什么?
我想这样做是因为在我的情况下是它的 ShowDialog 窗口,我希望源只有在用户单击“确定”时才会更新
提前致谢!
最佳答案
如果您真正使用 MVVM,那么您的 OK 按钮单击必须由某些 Command
处理。 .此命令必须来自您的 ViewModel
. Expliticly
绑定(bind)属性必须来自您的 ViewModel
再次。那么是什么阻止了你。
Explicit
绑定(bind)但使用 OneWay
捆绑。 OneWay
绑定(bind)依赖属性。 NotifyPropertyChanged
从您的 ViewModel
获取该房产. EmployeeViewModel
具有
EmployeeName
的类其中的属性(property)。该属性有一个 getter 和一个 setter。 setter 引发属性更改通知。 View 模型还有另一个类型为
ICommand
的属性。命名
SaveNameCommand
返回一个命令让我执行。
EmployeeViewModel
是我的 View 的数据上下文类型。 Myview 有一个
TextBox
(命名为 x:Name="EmployeeNameTxBx")
OneWay
绑定(bind)到
EmployeeName
和一个按钮为
OK
.我绑定(bind)
Button.Command
属性(property)到
EmployeeViewModel.SaveNameCommand
属性(property)和
Button.CommandParameter
绑定(bind)到
EmployeeNameTxBx.Text
属性(property)。
<StackPanel>
<TextBox x:Name="EmployeeNameTxBx"
Text="{Binding EmployeeName, Mode=OneWay}" />
<Button Content="OK"
Command="{Binding SaveNameCommand}"
CommandParameter="{Bidning Text, ElementName=EmployeeNameTxBx}" />
</StackPanel>
EmployeeViewModel
里面我有
OnSaveNameCommandExecute(object param)
执行我的方法
SaveNameCommand
.
var text = (string)param;
this.EmployeeName = text;
EmployeeName
模型的属性。
IDataErrorInfo
和相关验证仅在您的输入控件(例如文本框)为
时才有效。双向边界。是的,这就是它的意图。所以现在你可能会问“如果我们使用 IDataErrorInfo,这是否意味着不允许无效数据传递给模型的整个概念在 MVVM 中是徒劳的”?
IDataErrorInfo
工作并引发错误通知。关键是 ViewModel 只是
软拷贝 您的 View ,所以它可以是
脏 .应该确保的是,这种肮脏不是
promise 到您的外部接口(interface),例如服务或数据库。
ViewModel
的限制。通过测试无效数据。如果我们有
TwoWay
,数据就会出现。绑定(bind)启用。因此,考虑到您正在实现
IDataErrorInfo
那么你需要有
TwoWay
MVVM 中完全允许的绑定(bind)。
IDataErrorInfo.this
属性通过检查 isValidating 标志跳过验证...
string IDataErrorInfo.this[string columnName]
{
get
{
if (!isValidating) return string.Empty;
string result = string.Empty;
bool value = false;
if (columnName == "EmployeeName")
{
if (string.IsNullOrEmpty(AccountType))
{
result = "EmployeeName cannot be empty!";
value = true;
}
}
return result;
}
}
private void OnSaveNameCommandExecute(object param)
{
isValidating = true;
this.NotifyPropertyChanged("EmployeeName");
isValidating = false;
}
EmployeeName
必须包含无效数据才能进行验证。
Attached Behavior
.该行为将附加到“确定”按钮,并将接受需要刷新其绑定(bind)的所有项目的列表。
<Button Content="OK">
<local:SpecialBindingBehavior.DependentControls>
<MultiBinding Converter="{StaticResource ListMaker}">
<Binding ElementName="EmployeeNameTxBx" />
<Binding ElementName="EmployeeSalaryTxBx" />
....
<MultiBinding>
</local:SpecialBindingBehavior.DependentControls>
</Button>
ListMaker
是
IMultiValueConverter
这只是将值转换为列表...
Convert(object[] values, ...)
{
return values.ToList();
}
SpecialBindingBehavior
有一个
DependentControls
属性更改处理程序...
private static void OnDependentControlsChanged(
DependencyObject depObj,
DependencyPropertyChangedEventArgs e)
{
var button = sender as Button;
if (button != null && e.NewValue is IList)
{
button.Click
+= new RoutedEventHandler(
(object s, RoutedEventArgs args) =>
{
foreach(var element in (IList)e.NewValue)
{
var bndExp
= ((TextBox)element).GetBindingExpression(
((TextBox)element).Textproperty);
bndExp.UpdateSource();
}
});
}
}
关于wpf - 在 ShowDialog (WPF MVVM) 中将 UpdateSourceTrigger 设置为显式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7657996/
只是一个简短的问题: 在 wpf 中,如何在代码隐藏中设置和获取文本框的 updatesourcetrigger ? 谢谢 更新: 我遵循 AngleWPF 的代码: var bndE
我正在创建一个带有多个文本框的 WPF 窗口,当用户按下确定按钮时,我希望所有文本框都被评估为非空白。 我知道我必须使用带有'Explicit'的'UpdateSourceTrigger'的TextB
我正在尝试在按下某个键时验证文本框中的文本。这是显示我正在尝试做的事情的最短代码示例: “验证规则”类: class ValidationRules
我最近在 stack overflow 的帮助下解决了一个样式问题...(您可以在我的历史记录中看到问题/答案) 因此,我想到了以下应用于特定文本框的样式。
我正在寻找可以与我的绑定(bind)一起使用的 UpdateSourceTrigger 的自定义版本。我不知道这是否可能,或者相反,我只需要创建自己的绑定(bind)类。我正在寻找的是,而不是 Los
我有一个 TextBlock,与一个对象绑定(bind),当我更新对象的属性时,它没有反射(reflect)在 UI 上,为什么? 代码: 在 Windows1.xaml 中 和 Windows.x
xaml View 模型 public ProductVM() {
我有一个 WPF TextBox,它绑定(bind)到一个对象的(非依赖)属性(实现 INotifyPropertyChanged 以支持绑定(bind))。 验证是通过在绑定(bind)对象上实现
我有一个简单的 Converter,它向 TextBox 中输入的正数添加一个“+”符号。输入数字后,我想启动一些操作,但我不想等到 TextBox 失去焦点:我想在用户输入文本时立即更新绑定(bin
我一直在探索 Caliburn Micro MVVM 框架只是为了感受一下,但我遇到了一些问题。我有一个 TextBox 绑定(bind)到我的 ViewModel 上的字符串属性,我希望在 Text
我有以下 XAML - Start 在 ViewModel 中 - public string this[string columnName] { get {
我正在使用 ValidationRule在 TextBox在我看来,ValidationRule工作正常。 但是,当我处于 Command 的 canExecute 方法的状态时,就会出现问题。 (在
我有以下代码: public partial class Window1 : Window { public Window1() { Initi
MSDN 文档指出: Bindings that are TwoWay or OneWayToSource listen for changes in the target property and
我在 Windows 窗体中托管 WPF 用户控件 在 wpf 用户控件中,我使用来自 wpfToolkit.extended 的时间选择器 如果我使用向上键或向下键,或者只是在文本字段中输入时间,则
我正在使用 Xamarin.Forms,我的 View 完全在 XAML 中创建。我也在使用 Xamarin.Forms.Labs。 我已将 EntryCell 绑定(bind)到这样的属性: 该页
“名称”是在运行时与 TextBlock 绑定(bind)的对象的属性。我已经实现了 INotifyPropertyChanged,所以代码工作正常。我的问题是:如果我将 PropertyChang
我正在努力使用 DataGrid 捕获事件。我想要实现的是,当用户在数据网格单元格的复选框上单击一次时,会触发一个事件,我可以获得当前单元格值。但是,CellChangedEvent 仅在选择更改时触
我正在学习 WPF 教程系列。目前我在这一步 http://www.wpf-tutorial.com/data-binding/responding-to-changes/ 我遇到的问题是,我希望文本
我有两个文本框,如果我更改其中一个中的值,则应计算另一个文本框中的值。这需要双向发挥作用。 在我的 ViewModel 中,我有一个名为 NewProductCount 的属性/对象 priv
我是一名优秀的程序员,十分优秀!