更改颜色更改后WPF中的Textblock背景重置自身

时间:2015-04-09 18:30:30

标签: c# .net wpf xaml mvvm

我在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?)

1 个答案:

答案 0 :(得分:1)

O.K。,有完全尴尬的风险,这是导致眨眼问题的原始代码:

 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的建议导致了代表们的重新安排,但感谢所有人的帮助。