2013-09-27 115 views
0

我有一個包含一些「應用程序」對象的列表框。 「應用程序」對象可以啓動或停止。綁定不更新命令

對於我的Listbox中的每個元素,我有2個按鈕,第一個啓動應用程序,第二個停止應用程序。

但是,當我點擊開始按鈕時,它並沒有正確更新綁定「IsRunning」。 儘管「CommandManager.InvalidateRequerySuggested();」在單擊應用程序內部時,CanExecute of命令被重新評估

因此,我的啓動按鈕保持啓用狀態,我的停止按鈕從不顯示。

<ListBox Grid.Row="1" ItemsSource="{Binding Applications}" Grid.ColumnSpan="3" BorderThickness="0" Background="#FFE8E8E8" HorizontalContentAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Button Margin="5,0" Content = "Start" 
       Command="{Binding StartCommand}" 
       Visibility="{Binding IsRunning, Converter={Converters:InvertedBoolToVisibilityConverter}}"/> 
     <Button Margin="5,0" Content = "Stop" 
       Command="{Binding StopCommand}" 
       Visibility="{Binding IsRunning, Converter={Converters:BoolToVisibilityConverter}}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

在ApplicationViewModel:

public bool IsRunning 
{ 
    get 
    { 
    return this.m_IsRunning; 
    } 
    set 
    { 
    this.m_IsRunning = value; 
    this.OnPropertyChanged("IsRunning"); 
    CommandManager.InvalidateRequerySuggested(); 
    } 
} 
+1

愚蠢的問題:你是否更新'IsRunning'在命令回調?你是否更新'm_IsRunning'? – meilke

+0

是的,IsRunning已更新,因爲在另一個視圖中,每件事情都正確更新... –

+0

OMG!對不起,這是正確的......在另一個線程中,我設置了m_IsRunning而不是IsRunning ... –

回答

0

我從來沒有見過這樣的引用的轉換器。您需要somwhere創建它們,然後用StaticResource/DynamicResource引用它們:

<Window.Resources> 
    <Converters:InvertedBoolToVisibilityConverter x:Key="invBoolConv"/> 
</Window.Resources> 

<Button Margin="5,0" Content = "Start" 
     Command="{Binding StartCommand}" 
     Visibility="{Binding IsRunning, Converter={StaticResource invBoolConv}"/> 
+1

如果您在其上實現「MarkupExtension」,則可以使用這樣的轉換器... –