An update changing my relay command helped. although rooting funcs are not
Hi guys, I was making a small MVVM application. It is assumed that he takes a class full of Func<string> and displays a list of buttons, each of which executes a command containing Func<string> , and displays their return values ββin another list.
The program works fine at first , but after accidentally pressing a button, it simply stops the execution of commands. The user interface is still responsive. As if the binding had broken.
There are too many classes, so I linked the whole project in the following link
http://www.megafileupload.com/en/file/403770/GenericTester-zip.html
Relevant Code:
namespace AdapterTester.ViewModel { public class MainViewModel : ViewModelBase { public ObservableCollection<ViewableRelayCommand> CommandsList { get; set; } public ObservableCollection<string> Log { get; set; }
XAML:
<Window x:Class="AdapterTester.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ignore="http://www.ignore.com" mc:Ignorable="d ignore" Width="500" Height="300" Title="MVVM Light Application" DataContext="{Binding Main, Source={StaticResource Locator}}"> <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Skins/MainSkin.xaml" /> </ResourceDictionary.MergedDictionaries> <DataTemplate x:Key="myButtonTemplate"> <Button Content="{Binding Path=CommandName}" Command="{Binding Path=Command}" Margin="3"></Button> </DataTemplate> </ResourceDictionary> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <ListBox Name="CommandsListBox" Grid.Column="0" ItemsSource="{Binding CommandsList}" ItemTemplate="{StaticResource myButtonTemplate}"> </ListBox> <ListBox Name="LogListBox" Grid.Column="1" ItemsSource="{Binding Log}" </ListBox> </Grid> </Window>
update:
the answer should change:
Command = new RelayCommand(() => { Log.Insert(0, "-------------\n" + CommandName + "\n" + (iCommand.Invoke())); }),
like that:
List<Action> actions = new List<Action>(); public void Add(Func<string> iCommand, string CommandName, Func<bool> CanExecute = null) { Action act = () => { Log.Insert(0, "-------------\n" + CommandName + "\n" + (iCommand.Invoke())); }; actions.Add(act); CommandsList.Add(new ViewableRelayCommand() { Command = new RelayCommand(act) , CommandName = CommandName }); }
because the actions added to the relay command where not implemented