我在WPF用户控件中有一个文本块,定义为:
<TextBlock Grid.Column="0"
Text="{Binding RecognitionResults}"
Background="{Binding ResultBackground}" />
显示UserControl
的{{1}}被显示为来自另一个TextBlock
的{{1}}:
String
基本上,UserControl
会显示一个&#34; Strings&#34;的列表,每个字符串本身由其自己的<ItemsControl ItemsSource="{Binding Strings}" >
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Control.Margin"
Value="{Binding Margin}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
表示。
现在,当我点击ItemsControl
的显示时,手势执行此操作以在ViewModel中将背景颜色从黄色更改为绿色:
UserControl
TextBlock
颜色在ViewModel中定义为:
public void Refill()
{
ResultBackground = Brushes.Green;
}
因此,当我实际点击ResultBackground
时,手势会成功将其从黄色变为绿色。到目前为止一切都很好。
然而,当我从命令(即菜单命令)执行 private SolidColorBrush resultbackground =
(SolidColorBrush)new BrushConverter().ConvertFromString("#FFEFF100");
public SolidColorBrush ResultBackground
{
get
{
Console.WriteLine("Now getting resultbackground of "
+ resultbackground);
return resultbackground;
}
set
{
if (resultbackground != value)
{
resultbackground = value;
OnPropertyChanged("ResultBackground");
}
}
}
方法时,TextBlock
首先变为绿色(就像它应该的那样),但随后重新显示为初始黄色。观察上面Refill()
的输出确认首先调用get来将框变为绿色TextBlock
,但随后(没有堆栈跟踪),再次调用get(没有设置为叫)检索黄色!
我完全不知道为什么会发生这种情况或者如何解决这个问题。代码中唯一可以引用Console.WriteLine
的地方在上面的代码中。
任何帮助实现这一目标的人都会非常感激。
编辑:我不知道它是否相关,但执行refill()的命令正在从菜单执行为:
Refill()
其中OptionSubItems在viewmodel构造函数中构建为:
ResultBackground
和MyMenuItem是:
<UserControl x:Class="Nova5.UI.Views.Ink.InkView"
............................
<UserControl.Resources>
<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding OnSelected}" />
</Style>
</UserControl.Resources>
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate DataType="{x:Type m:MyMenuItem}" ItemsSource="{Binding Path=SubItems}">
<ContentPresenter
Content="{Binding Path=DisplayText}"
RecognizesAccessKey="True" />
</HierarchicalDataTemplate>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="25" />
</Grid.RowDefinitions>
<Menu Grid.Row="3" Height="28" >
<MenuItem Header="Options" ItemsSource="{Binding OptionSubItems}" DisplayMemberPath="{Binding DisplayText}" >
<MenuItem.ItemContainerStyle>
<Style>
<Setter Property="MenuItem.Command" Value="{Binding OnSelected}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</Menu>
</Grid>
ViewModel构造函数将命令列表动态构建为:
OptionSubItems = new ObservableCollection<MyMenuItem>();
和ExecuteMenuCommand执行:
public class MyMenuItem : MenuItemBase
{
private Action Command;
public MyMenuItem(String DisplayText, Action command)
{
this.DisplayText = DisplayText;
this.Command = command;
}
public override void OnItemSelected()
{
this.Command();
}
}
希望这会有所帮助。 (我想知道问题是否在上面的xaml中,两个绑定到不同样式的OnSelected?)
答案 0 :(得分:1)
OptionSubItems.Add(new MyMenuItem("Refill all current prescriptions", delegate()
{
CurrentViewModelDetails.ExecuteMenuCommand("RefillAllCurrentPrescriptions");
CurrentViewModelDetails.RefreshDisplay(RxViews.PrescriptionList);
DialogTitle = "Current Prescriptions";
}));
RefreshDisplay()
方法是从数据库重建显示并完全放弃refill()
的效果 - 这解释了为什么get{}
上的断点没有显示任何堆栈跟踪。创建新对象时,XAML正在调用get{}
;没有涉及set{}
。所以上面的代码实际上工作正常(在我删除违规行之后,SO更加简洁)。
为了给予信用到期的信用,Rachel的建议导致了代表们的重新安排,但感谢所有人的帮助。