2011-04-21 75 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