我創建了一些具有綁定能力的「ClearCommand」ICommand依賴項屬性的自定義控件(而不是UserControls)。這個屬性將完成它的聲音:它將清除控件中的所有值(文本框等)。我也將這些相同的屬性(一些)綁定到我在下面描述的VM。使用MVVM從WPF中的ViewModel觸發命令
現在我被困試圖觸發ClearCommand在這些控制在下面的MVVM場景:
我已經添加了幾個這樣的控件進入我的視野。該視圖還包含一個「保存」按鈕,該按鈕綁定到我的ViewModel的屬性SaveCommand
DelegateCommand
屬性。
我需要做的是,成功保存後,虛擬機應該觸發視圖中找到的那些控件上的ClearCommand
。
UPDATE
我已經添加下面的代碼示例。我有幾個類似於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>
例視圖模型:
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
}
}
通常情況下,我的命令是在我的視圖模型。從ViewModel,你可以調用'MyCommand.Execute();'。如果這不是你的項目的結構,請張貼一些代碼來澄清。 – cadrell0
作爲一個快速的解決方法,當你註冊SelectedIOtemProperty和回調,有你想要的一切清楚你可以設置PropertyChangedCallback在PropertyMetadata。不過,我會建議你考慮重構你的設置,並將所有綁定屬性與虛擬機一起清除。 – HAdes
將所有ExampleCustomControl的屬性綁定到視圖模型的問題將重用。我希望搜索邏輯/等坐在自定義控件中,我希望能夠在幾個不同的視圖中重用相同的控件。 – Alex