0

在执行特定的 ICommand 后,我需要对控件做一些视觉效果。例如,我的自定义控件公开了 AAACommand 和 BBBCommand 属性。

<myControl AAACommand={Binding ACommand}
           BBBCommand={Binding BCommand} />

其中 ACommand 和 BCommand 是 ViewModel 上的命令。我怎么知道 AAACommand 何时执行,所以我可以在我的 UserControl 中做一些 UI 工作?没有 ICommand 订阅的 Executed 事件。

编辑: AAACommand 在我的用户控件上定义如下:

public static readonly DependencyProperty AAACommandProperty =
        DependencyProperty.Register("AddCommand", typeof(RelayCommand), typeof(MyCustomControl), null);

public static readonly DependencyProperty AAACommandParameterProperty =
        DependencyProperty.Register("AAACommandParameter", typeof(object), typeof(MyCustomControl), null);

public RelayCommand AAACommand
{
    get { return (RelayCommand)GetValue(AAACommandProperty); }
    set { SetValue(AAACommandProperty, value); }
}

public object AAACommandParameter
{
    get { return (object)GetValue(AAACommandParameterProperty); }
    set { SetValue(AAACommandParameterProperty, value); }
}

因此,在 ViewModel 上调用 ACommand 没有问题,这没有问题。问题是我的用户控件将如何知道 AAACommand 何时执行 ACommand,以便它可以对其 UI 执行某些操作。

4

1 回答 1

0

您想根据视图模型返回的响应和执行的命令来更新用户控件吗?我问了一个性质类似的问题,我想将字符串值从一个用户控件传递到另一个用户控件。我使用 INotifyProperty Changed 事件完成了此操作。您可以在此处阅读原始问题和解决方案

更新评论:

根据您的评论,似乎可能会发生两件事之一。如果您不需要 VM 响应,则可以由视图中的元素触发更新。您可以使用 Binding ElementNameProperty 来做到这一点。这实质上允许您根据另一个元素的操作触发/更改属性。(在一个字段中键入文本会在另一个控件中显示该值)这是 msdn 描述和示例

如果您需要根据返回(即成功或失败)调用它,那么 ViewModel 将需要一个属性(如布尔值),该属性以双向方式绑定到 ui 中元素的属性。您可能需要创建一个转换器(继承IValueConverter)来处理绑定,但 INotifyProp Change 将用于编组控件之间的更新或其中的绑定元素。

这是一个简单的例子:

在我的 xaml 中,我添加了一个用户控件,在单击辅助用户控件中的另一个按钮之前,我不想在 UI 中显示该控件。为了处理这个问题,我在 Visibility 属性上设置了绑定

<ctrl:LandingPage x:Name="ucLandingPage"
                                  Grid.Row="1" 
                                  DataContext="{Binding}"  
                                  Visibility="{Binding LandingPageVisibility, Mode=OneWay, Converter={StaticResource LandingPageVisibilityConverter}}"/>

在视图模型中,我有以下属性和代码

// Default ctor
        public SearchViewModel()  
        {
            //Show that the Landing Page control is being displayed
            SearchVisibility = Visibility.Collapsed;
}

VM 中的属性(注意我使用 SimpleMVVM 框架,它在基础对象中包含了 Inotify,所以我的 notify prop 事件可能看起来与你的有点不同)

 private Visibility _SearchVisibility;
            public Visibility SearchVisibility
            {
                get { return _SearchVisibility; }
                set
                {
                    _SearchVisibility = value;
                    NotifyPropertyChanged(m => m.SearchVisibility);
                }
            }

然后更新此属性的 VM 中的方法

 public void GetSearchResult()
        {
            currentPage = 1;
            //Set the visibility of the search control in the center of the page
            SearchVisibility = Visibility.Visible;
            this.SearchHistory = this._DataModel.AddSearchHistoryItem(this.SearchTerm);
        }

最后是转换器类,它将返回值转换为元素的正确属性值

  public class SearchVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null & System.Convert.ToString(value) == "Visible")
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
于 2012-05-09T12:07:12.770 回答