2011-04-21 65 views
1

束缚时,我有类似下面的内财产上的ItemsSource

<ItemsControl ItemsSource="{Binding MyClass.Links}" > 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid d:DesignWidth="450" d:DesignHeight="245" Height="Auto" Width="Auto"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" MinWidth="145"/> 
       <ColumnDefinition Width="Auto" MinWidth="179"/> 
      </Grid.ColumnDefinitions> 
      <HyperlinkButton Content="{Binding ViewName}" IsEnabled="{Binding ViewEnabled, Mode=OneWay}" cmd:Click.Command="{Binding DataSource.ViewCommand, Source={StaticResource DataContextProxy}}" cmd:Click.CommandParameter="{Binding}" Margin="4"/> 
     </Grid> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

我的的ItemsSource是越来越势必

public class LinkClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public string ViewName { get; set; } 
    private bool _viewEnabled; 
    public bool ViewEnabled { 
    get { return this._viewEnabled; } 
     set 
     { 
      if (value != this._viewEnabled) 
      { 
       this._viewEnabled = value; 
       if (this.PropertyChanged != null) 
       { 
        Deployment.Current.Dispatcher.BeginInvoke(() => 
          this.PropertyChanged(this, new PropertyChangedEventArgs("ViewEnabled")) 
         ); 
       } 
      } 
     } 
    } 
} 
以下类的一个ObservableCollection一个ItemsControl不更新

当命令在视图模型中被命中时,绑定链接的ViewEnabled被设置为false(禁用链接以查看我正在查看的视图)。问题是,链接实际上并未被禁用(IsEnabled设置为false)。

所以最终的问题是,为什么这不起作用?我是MVVM和silverlight的新手,所以我希望这很简单。

UPDATE

我的ViewEnabled属性设置为true,但所有点击的按钮的束缚LinkClass,这我设置为false。它为每个(更改)触发PropertyChanged事件,但不更新UI。我用绑定运行了一个空转换器,当链接被点击时它不会被点击,所以PropertyChanged没有正确冒泡(或者我怀疑它应该)。

下面的代码设置我的收藏LinkClass的ViewEnabled属性:

public ICommand ViewCommand 
    { 
     get { 
      return new DelegateCommand<object>(param => 
       { 
        this.ViewSelected((LinkClass)param); 
       }); 
     } 
    } 

    public void ViewSelected(LinkClass link) 
    { 
       foreach (var containerLink in _myClass.Links) 
       { 
        if (containerLink == link) 
         containerLink.ViewEnabled = false; 
        else 
         containerLink.ViewEnabled = true; 
       } 
     ...other code here 
    } 

回答

0

以何塞的建议下,我看着ViewCommand(DelegateCommand)的canExecute方法我用,但实施该方法并没有解决问题,因为它只运行一次,而不是改变时。我发现了一个示例,建议使用INotifyPropertyChanged类的PropertyChanged事件处理程序来调用DelegateCommand的RaiseCanExecuteChanged()方法。我这样做是为了所有的LinkClass实例,如下所示1将其设置为_myClass.Links前:

var link = new LinkClass() 
          { 
           ... 
           ViewEnabled = true 
          }; 
          link.PropertyChanged += new PropertyChangedEventHandler(link_PropertyChanged); 
          return link; 

我这样做,但都无济于事。然后,我发现了这篇博客文章:DelegateCommand in Prism loses eventhandler and CanExecute never gets called然后,我从Prism切换到RelayCommand类,它工作!希望这可以帮助别人。

UPDATE

实际的问题是在使用棱镜的CMD:Click.CommandCMD:Click.CommandParameter在XAML。从切换到命令CommandParameter在XAML性能,我切换到RelayCommand后所做的,是实际得到它的工作。

0

当我使用MVVM,在我的财产的二传手我有一个名为NotifyPropertyChanged()方法,并把它叫做传递该属性名称的字符串值。我不确定Deployment.Current.Dispatcher.BeginInvoke(...)会执行什么操作,但是这种方法一直适用于我。

public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 

     if (handler.IsNotNull()) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

所以在我的财产我会做这样的事情......

public Nullable<int> UpdatedBy 
    { 
     get { return _updatedBy; } 
     set 
     { 
      if (_updatedBy.IsEqualTo(value)) 
       return; 

      _updatedBy = value; 
      NotifyPropertyChanged("UpdatedBy"); 
     } 
    } 

而且,就在抓救命稻草,但尝试把{绑定路径= ViewEnabled,...} 希望这有助于。

+0

在您的示例中,您将处理程序设置为PropertyChanged,然后以相同方式调用它。 Dispatcher.BeginInvoke是强制它在UI线程上运行,从而避免了我收到的错误。我在绑定中添加了显式路径,但无济于事。感谢您的帮助! – DougJones 2011-04-21 22:18:48

+0

所以我的下一个问题是,你什么时候把它设置为false?实例化时你是否被设置为false?尝试做...私人布尔_viewEnabled = false;对不起,我没有太多的帮助。看起来像一个简单的问题,不应该是一个问题。看起来是对的。另外,我不熟悉cmd:Click.Command和cmd:Click.Parameter,但是有没有可能通过绑定来绑定IsEnabled绑定? – jhorton 2011-04-22 12:54:58

+0

我在设置ViewEnabled属性的地方添加了代码。 – DougJones 2011-04-23 16:54:20

1

那么它实际上可能会被禁用,但如果您ViewCommand不注意那个属性,那么你卡住了。特别是因为它看起来像命令是一个附加属性。

使用谷歌搜索得到我this post,你可能想看看。

但我个人想看看你对你的ViewCommandCanExecute并确保其只运行,如果ViewEnabled == true

+0

那么当我进行绑定2的方式,它实际上禁用所有链接。第一次传球似乎是正确的,然后第二次传球禁用了所有传球。我知道它在禁用时的功能。当它是,我的ViewCommand方法不运行。 – DougJones 2011-04-23 16:57:41

+0

感谢您的帮助。你绝对指出我正确的方向。 – DougJones 2011-04-23 23:26:37