gpt4 book ai didi

wpf - 使用 MVVM 从 WPF 中的 ViewModel 触发命令

转载 作者:行者123 更新时间:2023-12-03 10:15:13 25 4
gpt4 key购买 nike

我创建了一些具有可绑定(bind)“ClearCommand”ICommand 依赖属性的自定义控件(不是用户控件)。这个属性将完全按照它的意思做:它将清除控件中的所有值(文本框等)。我还将(一些)相同的属性绑定(bind)到我在下面描述的 VM。

现在我被困在尝试在以下 MVVM 场景中触发这些控件中的 ClearCommand :

我在我的 View 中添加了一些这样的控件。该 View 还包括一个绑定(bind)到我的 ViewModel 的 SaveCommand 的“保存”按钮。 DelegateCommand属性(property)。

我需要发生的是,成功保存后,VM 应该触发 ClearCommand在 View 中找到的那些控件上。 enter image description here

更新

我在下面添加了代码示例。我有一些类似于 ExampleCustomControl 的控件。另外,请注意,如果它完全关闭,我愿意重组其中的一些。

示例控制片段:

public class ExampleCustomControl : Control {

public string SearchTextBox { get; set; }
public IEnumerable<CustomObject> ResultList { get; set; }

public ExampleCustomControl() {
ClearCommand = new DelegateCommand(Clear);
}

/// <summary>
/// Dependency Property for Datagrid ItemSource.
/// </summary>
public static DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem",
typeof(CustomObject), typeof(ExampleCustomControl), new PropertyMetadata(default(CustomObject)));

public CustomObject SelectedItem {
get { return (CustomObject)GetValue(SelectedCustomObjectProperty); }
set { SetValue(SelectedCustomObjectProperty, value); }
}

public static DependencyProperty ClearCommandProperty = DependencyProperty.Register("ClearCommand", typeof(ICommand),
typeof(ExampleCustomControl), new PropertyMetadata(default(ICommand)));

/// <summary>
/// Dependency Property for resetting the control
/// </summary>
[Description("The command that clears the control"), Category("Common Properties")]
public ICommand ClearCommand {
get { return (ICommand)GetValue(ClearCommandProperty); }
set { SetValue(ClearCommandProperty, value); }
}

public void Clear(object o) {
SearchTextBox = string.Empty;
SelectedItem = null;
ResultList = null;
}
}

示例 View 片段:
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<control:ExampleCustomControl Grid.Row="0"
SelectedItem="{Binding Selection, UpdateSourceTrigger=PropertyChanged}" />
<Button Grid.Row="1" x:Name="ResetButton" Command="{Binding SaveCommand}">
Save
</Button>
</Grid>

示例 View 模型:
public class TestViewModel : WorkspaceTask {
public TestViewModel() {
View = new TestView { Model = this };
SaveCommand = new DelegateCommand(Save);
}

private CustomObject _selection;
public CustomObject Selection {
get { return _selection; }
set {
_selection = value;
OnPropertyChanged("Selection");
}
}

public DelegateCommand SaveCommand { get; private set; }
private void Save(object o) {
// perform save
// clear controls
}
}

最佳答案

正如其他人所说,VM 不应该直接在 MVVM 中知道 View ,因此 VM 在您的自定义控件上触发某些内容以清除所有内容并没有任何意义。

我会设置 DataContext将自定义控件转换为具有您要清除的所有属性的对象,这些属性都绑定(bind)(双向)到您的文本框等。然后在 Save() 方法中,您可以设置一个新对象(自定义控件DataContext 绑定(bind)到) 并且所有属性都将为您清除(假设您已在对象上实现 INotifyPropertyChanged)。

更新:

根据我的评论,请参阅当前设置的解决方法示例(未经测试的顺便说一句):

    public static DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem",
typeof(CustomObject), typeof(ExampleCustomControl), new PropertyMetadata(default(CustomObject), OnSelectedItemChanged));


private static void OnSelectedItemChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
var cont = source as ExampleCustomControl;

//do all the clearing of txtboxes etc here....
cont.SearchTextBox = string.Empty;
}

但我仍然会尝试将所有这些移到 VM 中。即有一个明确的命令,就像您使用 save 命令所做的那样,并将文本框文本等绑定(bind)到 VM 中的属性,当调用该命令时,它会清除所有内容,然后您也可以轻松地从 VM 中的 Save 方法调用它。但显然我不知道您从长远来看要达到什么目标,也不知道 selectedItem 和文本框等是如何相关的,所以我猜(一如既往)取决于。

关于wpf - 使用 MVVM 从 WPF 中的 ViewModel 触发命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10413830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com