Конвертер не вызывается после выполнения команды - PullRequest
0 голосов
/ 02 мая 2018

Эта кнопка должна циклически перемещаться по доступному списку цветов и соответственно менять цвет фона.

Изначально я имел эту часть кода модели представления в одной модели большого / основного вида, но решил разделить ее так, чтобы у каждого из моих пользовательских элементов управления была своя собственная модель представления. Я попытался установить точку останова, когда выполняется метод OnChangeColor (), и я вижу, что состояние действительно меняется, но, похоже, оно не сохраняется в этом преобразователе, который, следовательно, вообще не обновляет цвет фона пользовательского интерфейса.

Я разместил нижеприведенный код, в который внес изменения, и в настоящее время работаю с ним, чтобы попытаться выяснить, в чем заключается проблема.

MainWindow

    <Window.DataContext>
    <local:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
    <DataTemplate DataType="{x:Type local:CameraListViewModel}">
        <local:MainView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type rep:ReportViewModel}">
        <rep:ReportView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type cam:CameraMonitorViewModel}">
        <cam:CameraMonitorView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type cam:CameraPropertiesViewModel}">
        <cam:CameraPropertiesView />
    </DataTemplate>
</Window.Resources>
<Grid>
    <ContentControl Content="{Binding CurrentViewModel}" />
</Grid>

Просмотр модели:

public class CameraPropertiesViewModel : ViewModelBase
{    
    /// <summary>
    /// The current state of the background color
    /// </summary>
    private States _state;

    //Delegate commands for the UI
    private DelegateCommand _changeColorCommand;
    public ICommand ChangeColorCommand
    {
        get
        {
            if (_changeColorCommand == null)
            {
                _changeColorCommand = new DelegateCommand(OnChangeColor);
            }
            return _changeColorCommand;

        }
    }

    //All possible background colors
    public enum States
    {
        GREEN,
        YELLOW,
        RED
    }

    //Gets or sets the background color
    public States State
    {
        get
        {
            return _state;
        }
        set
        {
            SetProperty(ref _state, value);
        }
    }

    //Cycle through different colors
    private void OnChangeColor()
    {
        if (State == States.GREEN)
            State = States.RED;
        else if (State == States.RED)
            State = States.YELLOW;
        else if (State == States.YELLOW)
            State = States.GREEN;
    }

}

Преобразователь:

    [ValueConversion(typeof(CameraPropertiesViewModel.States), typeof(Brush))]
public class EnumToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        CameraPropertiesViewModel.States state = (CameraPropertiesViewModel.States)value;

        switch (state)
        {
            case CameraPropertiesViewModel.States.GREEN:
                return new SolidColorBrush(Colors.Green);
            case CameraPropertiesViewModel.States.YELLOW:
                return new SolidColorBrush(Colors.Yellow);
            case CameraPropertiesViewModel.States.RED:
                return new SolidColorBrush(Colors.Red);
        }

        return new SolidColorBrush(Colors.LightGray);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

MainView

    <UserControl.Resources>
    <conv:EnumToColorConverter x:Key="enumToColorConvert"/>
    <cam:CameraPropertiesViewModel x:Key="CPVM" />
</UserControl.Resources>

<Grid Background="{Binding Path=State, Source={StaticResource CPVM},  Converter={StaticResource enumToColorConvert}}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition  />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>

    <cam:CamerasListView />

    <cam:CameraPropertiesView Grid.Column="1"/>

    <cam:CameraMonitorView Grid.Row="1" 
                           Grid.ColumnSpan="2" />

    <cam:CameraFunctionView Grid.Row="2" 
                            Grid.ColumnSpan="2"/>
</Grid>

Ресурсы:

<local:CameraPropertiesViewModel x:Key="CPVM" />

Кнопка

 <Button Style="{StaticResource circleButton}"
                    Command="{Binding ChangeColorCommand, Source={StaticResource CPVM}}"                     
                    Content="Change Theme" 
                    Width="100" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center"  
                    Grid.Column="2"
                    Grid.Row="2"/>

CameraPropertiesView.xaml

<UserControl.Resources>
    <local:CameraPropertiesViewModel x:Key="CPVM" />
    <Style TargetType="{x:Type Button}" x:Key="circleButton">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Grid>
                        <Viewbox>
                            <Canvas Width="50" Height="50">
                                <Ellipse Fill="{TemplateBinding Control.Background}" Width="50" Height="50"/>
                            </Canvas>
                        </Viewbox>
                        <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Content="{TemplateBinding Button.Content}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<Grid>
    <GroupBox Header="Camera Details" 
              Height="130" 
              Width="386" 
              HorizontalAlignment="Right" 
              VerticalAlignment="Top"
              Margin="10">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
                <ColumnDefinition Width="120" />
            </Grid.ColumnDefinitions>

            <Label Height="25" 
                   Width="70" 
                   Content="Name" 
                   HorizontalAlignment="Center" 
                   VerticalAlignment="Center"
                   HorizontalContentAlignment="Right" />
            <TextBox Text="{Binding ConnectedCamera.Name}" 
                     HorizontalAlignment="Center" 
                     VerticalAlignment="Center" 
                     Height="23" 
                     Width="160"
                     Grid.Column="1"
                     IsReadOnly="True" />

            <Label Height="25" 
                   Width="70" 
                   Content="Model" 
                   HorizontalAlignment="Center" 
                   VerticalAlignment="Center" 
                   Grid.Row="1"
                   HorizontalContentAlignment="Right" />
            <TextBox Text="{Binding ConnectedCamera.Model}" 
                     HorizontalAlignment="Center" 
                     VerticalAlignment="Center" 
                     Height="23" 
                     Width="160"
                     IsReadOnly="True"
                     Grid.Column="1"
                     Grid.Row="1" />

            <Label Height="25" 
                   Width="70" 
                   Content="Ip Address" 
                   HorizontalAlignment="Center" 
                   VerticalAlignment="Center" 
                   Grid.Row="2"
                   HorizontalContentAlignment="Right" />
            <TextBox Text="{Binding ConnectedCamera.IpAddress}" 
                     HorizontalAlignment="Center" 
                     VerticalAlignment="Center" 
                     Height="23" 
                     Width="160"
                     IsReadOnly="True" 
                     Grid.Column="1"
                     Grid.Row="2" />

            <Button Command="{Binding GenerateReportCommand}"
                    Content="Generate Report" 
                    Width="100" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center"  
                    Grid.Column="2" />

            <Button Command="{Binding ArchiveReportCommand}"
                    Content="Archive Report" 
                    Width="100" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center"  
                    Grid.Column="2"
                    Grid.Row="1"/>

            <Button Style="{StaticResource circleButton}"
                    Command="{Binding ChangeColorCommand, Source={StaticResource CPVM}}"                     
                    Content="Change Theme" 
                    Width="100" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center"  
                    Grid.Column="2"
                    Grid.Row="2"/>

        </Grid>
    </GroupBox>
</Grid>

1 Ответ

0 голосов
/ 02 мая 2018

Мне удалось воспроизвести вашу проблему, убрав несущественные стили, модели представления и т. Д.

Вам просто не хватает атрибута Source в привязке к сетке.
Обратите внимание, что у вас есть кнопка, а не сетка.

    <Grid Background="{Binding Path=State, 
        Converter={StaticResource enumToColorConvert}}">

Должно быть:

    <Grid Background="{Binding Path=State, 
        Converter={StaticResource enumToColorConvert}, 
        Source={StaticResource CPVM}}">
...