将样式绑定到TextBox

时间:2016-05-24 23:52:18

标签: c# wpf mvvm data-binding wpf-controls

我有一个类似以下的TextBox:

<TextBox 
 Name="TxtBackupPath" 
 Grid.Column="0"
 Grid.Row="0"
 Height="Auto" 
 TextWrapping="Wrap" 
 Style="{Binding Path=BackupPathStyle}" 
 Foreground="{Binding Path=ForegroundColor}"
 Text="{Binding Path=BackupPath, Mode=TwoWay}" 
 VerticalAlignment="Stretch" 
 AcceptsReturn="True"
 Margin="3,3" 
 VerticalScrollBarVisibility="Disabled"
 />

在Code中我可以像下面这样设置ForegroundColor而不会出错:

Brush _Red = Brushes.Red;
backupDirectory.ForegroundColor = _Red;

backupDirectory是绑定到UI的dataSource。我试图使用MVVM作为模式通过代码中的属性设置UI元素。当我尝试使用类似的样式时:

Style style = new Style(typeof(TextBox));
style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Goldenrod));
style.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.Aqua));
backupDirectory.BackupPathStyle = style;

我得到“调用线程无法访问此对象,因为另一个线程拥有它。”错误。我不明白为什么Style和Foreground在从代码设置时会有不同的反应。

是否可以通过属性设置TextBox的样式?使用MVVM最简单的方法是什么?

2 个答案:

答案 0 :(得分:0)

  

我得到“调用线程无法访问此对象,因为另一个线程拥有它。”错误。我不明白为什么Style和Foreground在从代码设置时会有不同的反应。

必须从(唯一的)UI线程设置此类属性 - 您的代码显然在后台线程上运行。您可以安排在UI线程上执行的代码,如下所示:

Dispatcher.Invoke(() => MyControl.Style = new Style());

那就是说,至少包括backupDirectory的部分内容(特别是你设置的属性)会有所帮助。

答案 1 :(得分:0)

我要做一些猜测。

  1. 您的代码正在另一个线程中运行。
  2. Brush _Red = Brushes.Red; backupDirectory.ForegroundColor = _Red;不会实例化任何新对象; Brushes.Red是一个静态属性,已由UI线程实例化,而您只是将该预先实例化对象的引用分配给ForegroundColor属性。
  3. Style style = new Style(typeof(TextBox));显然是在实例化Style类的新实例。如果point 1正确,则不会在UI线程上创建此对象。