C# 转换器没有';在命令执行后无法调用
这个按钮应该做的是在可用的颜色列表中循环,并相应地更改背景颜色 最初,我将视图模型代码的这一部分放在一个大/主视图模型中,但决定将其拆分,以便我的每个用户控件都有自己的视图模型。我尝试在OnChangeColor()方法执行的地方设置一个断点,我看到状态确实发生了变化,但它似乎没有将这种变化持续到转换器,因此根本不会更新UI的背景色 我已经发布了下面的代码,我已经对其进行了编辑,目前正在与之合作,试图找出问题所在 主窗口C# 转换器没有';在命令执行后无法调用,c#,wpf,binding,command,converter,C#,Wpf,Binding,Command,Converter,这个按钮应该做的是在可用的颜色列表中循环,并相应地更改背景颜色 最初,我将视图模型代码的这一部分放在一个大/主视图模型中,但决定将其拆分,以便我的每个用户控件都有自己的视图模型。我尝试在OnChangeColor()方法执行的地方设置一个断点,我看到状态确实发生了变化,但它似乎没有将这种变化持续到转换器,因此根本不会更新UI的背景色 我已经发布了下面的代码,我已经对其进行了编辑,目前正在与之合作,试图找出问题所在 主窗口 <Window.DataContext> &l
<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>
主视图
<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>
我可以通过剥离不重要的样式、视图模型等来重现您的问题 您只是缺少网格绑定中的源属性。
请注意,它是如何用于按钮而不是网格的
<Grid Background="{Binding Path=State,
Converter={StaticResource enumToColorConvert}}">
需要:
<Grid Background="{Binding Path=State,
Converter={StaticResource enumToColorConvert},
Source={StaticResource CPVM}}">
为什么会有ViewModel对象<代码>和
?什么是main视图
,我们是否需要查看cameraproperties视图
的源代码?如何设置ViewModels/DataContext?@user1672994是因为绑定属性“State”位于该视图模型中,这就是我创建对的引用的方式it@V.LeonMainView本质上是一个视图类,它包含子视图类的名称空间。我认为视图模型/datacontext的设置如上面显示的MainWindow.xaml所示。@nwahs-我的问题是为什么两个不同的对象具有相同的视图模型?很抱歉,我忘了包括那个固定的部分,但我已经尝试过了,它仍然不起作用:(基本上,它是从状态变量开始的,它最初位于一个名为CameraListViewModel的大视图模型中,然后我决定将该逻辑的一部分拆分为它自己的用户控件和视图模型(CameraPropertyView&CameraPropertiesViewModel).现在,我从原始视图模型复制并粘贴了与此1按钮相关的代码,并注释掉了原始视图模型中的部分。我已检查它是否确实正在读取此新视图模型中的状态值。
<Grid Background="{Binding Path=State,
Converter={StaticResource enumToColorConvert}}">
<Grid Background="{Binding Path=State,
Converter={StaticResource enumToColorConvert},
Source={StaticResource CPVM}}">