- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想将 TextBlock 的前景属性绑定(bind)到我的 ViewModel 中的属性。
这行不通:
编辑
View :
TextBlock
Text="{Binding Path=FullName, Mode=OneWay}"
Foreground="{Binding Path=ForegroundColor}"
Margin="0 5 3 5"
代码隐藏:
CustomerHeaderViewModel customerHeaderViewModel = new CustomerHeaderViewModel();
customerHeaderViewModel.LoadCustomers();
CustomerHeaderView.DataContext = customerHeaderViewModel;
查看模型:
private System.Windows.Media.Brush _foregroundColor;
_foregroundColor = System.Windows.Media.Brushes.DarkSeaGreen;
public System.Windows.Media.Brush ForegroundColor
{
get { return _foregroundColor; }
set { _foregroundColor = value;
OnPropertyChanged("ForegroundColor");
}
}
public CustomerHeaderViewModel()
{
ForegroundColor = System.Windows.Media.Brushes.Red;
}
所有其他属性(文本等)正确绑定(bind)。
我做错了什么?
最佳答案
检查你的解决方案是否是这样的:查看:
<Window x:Class="WpfApplication13.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:vm="clr-namespace:WpfApplication13"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:MainVM/>
</Window.DataContext>
<Grid>
<TextBlock Text="{Binding Path=FullName, Mode=OneWay}"
Foreground="{Binding Path=ForegroundColor}"
Margin="0 5 3 5"/>
</Grid>
</Window>
View 模型:
public class MainVM : INotifyPropertyChanged
{
protected void OnPropertyChanged(string porpName)
{
var temp = PropertyChanged;
if (temp != null)
temp(this, new PropertyChangedEventArgs(porpName));
}
public event PropertyChangedEventHandler PropertyChanged;
private System.Windows.Media.Brush _foregroundColor = System.Windows.Media.Brushes.DarkSeaGreen;
public string FullName
{
get
{
return "Hello world";
}
}
public System.Windows.Media.Brush ForegroundColor
{
get { return _foregroundColor; }
set
{
_foregroundColor = value;
OnPropertyChanged("ForegroundColor");
}
}
}
请记住,如果您想在 VM 中为 ForegroundColor 设置新值,您应该这样做:
ForegroundColor = System.Windows.Media.Brushes.Red;
引发 PropertyChangedEvent
根据有关您的问题的新信息,您可以尝试以下解决方案:
CustomerHeaderViewModel.cs
class CustomerHeaderViewModel : INotifyPropertyChanged
{
public ObservableCollection<Customer> Customers { get; set; }
public void LoadCustomers()
{
ObservableCollection<Customer> customers = new ObservableCollection<Customer>();
//this is where you would actually call your service
customers.Add(new Customer { FirstName = "Jim", LastName = "Smith", NumberOfContracts = 23 });
customers.Add(new Customer { FirstName = "Jane", LastName = "Smith", NumberOfContracts = 22 });
customers.Add(new Customer { FirstName = "John", LastName = "Tester", NumberOfContracts = 33 });
customers.Add(new Customer { FirstName = "Robert", LastName = "Smith", NumberOfContracts = 2 });
customers.Add(new Customer { FirstName = "Hank", LastName = "Jobs", NumberOfContracts = 5 });
Customers = customers;
}
protected void OnPropertyChanged(string porpName)
{
var temp = PropertyChanged;
if (temp != null)
temp(this, new PropertyChangedEventArgs(porpName));
}
public event PropertyChangedEventHandler PropertyChanged;
private System.Windows.Media.Brush _foregroundColor = System.Windows.Media.Brushes.DarkSeaGreen;
public System.Windows.Media.Brush ForegroundColor
{
get { return _foregroundColor; }
set
{
_foregroundColor = value;
OnPropertyChanged("ForegroundColor");
}
}
}
CustomerHeaderView.xaml
<UserControl x:Class="TestMvvm444.Views.CustomerHeaderView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="main">
<Grid>
<StackPanel HorizontalAlignment="Left">
<ItemsControl ItemsSource="{Binding Path=Customers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<TextBox
Text="{Binding Path=FirstName, Mode=TwoWay}"
Width="100"
Margin="3 5 3 5"/>
<TextBox
Text="{Binding Path=LastName, Mode=TwoWay}"
Width="100"
Margin="0 5 3 5"/>
<TextBlock
Text="{Binding Path=FullName, Mode=OneWay}"
Foreground="{Binding ElementName=main, Path=DataContext.ForegroundColor}"
Margin="0 5 3 5"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</UserControl>
在呈现的场景中,ForegroundColor 属性位于 CustomerHeaderViewModel.cs 中,因此它对所有客户都有值(value)。在 CustomerHeaderView.xaml 中,我为 UserControl 添加了 x:Name,以便可以引用此元素的 DataContext。如果你不想为 UserControl 使用 x:Name,你可以试试这个:
<TextBlock
Text="{Binding Path=FullName, Mode=OneWay}"
Foreground="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}, Path=DataContext.ForegroundColor}"
Margin="0 5 3 5"/>
请记住,此控件的 DataContext 是在 MainWindow.cs 中较早设置的。
主窗口.cs
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
CustomerHeaderViewModel customerHeaderViewModel = new CustomerHeaderViewModel();
customerHeaderViewModel.LoadCustomers();
CustomerHeaderView.DataContext = customerHeaderViewModel;
}
}
关于c# - 如何将前景绑定(bind)到我的 ViewModel 中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5601489/
我的应用程序可以正确接收通知,但无法显示包含收到的信息的弹出通知(如果应用程序已打开)。 注意:如果应用程序在后台,通知会毫无问题地显示。 我的代码: 我以这种方式收到通知: @Override pu
我需要根据收到远程推送通知的时间来处理它们。当应用程序在后台或终止时,如果我收到推送通知,当我点击推送通知时,我会在 ` 中处理它 - (void)application:(UIApplication
我想根据控件的状态更改/动画自定义按钮控件模板的 Foreground 属性。 在 RC0 之前,我设置了 ContentPresenter 的前景,给它一个 x:Name,并在 VisualStat
我正在尝试设置 block ,以便其前景色每次都会改变鼠标光标移到它上面,这是我的代码: Remove Message
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。 6
有时,当我执行“docker-compose up -d”时,我忘记了“-d”部分。因此它开始向我显示启动日志,如果我按Ctrl + C,它将终止所有过程并向我显示关闭日志。 我对此有几个问题: 如果
我有一个启动器风格的应用程序。用户启动应用程序后,时钟开始滴答作响,经过一定时间后,用户将返回到我的应用程序的主要 Activity,并被告知时间到了。 为了实现这一点,我有一个 AsyncTask,
我有一个 FrameLayout,我想通过选择器为它应用前景可绘制对象,我正在尝试实现“drawSelectorOnTop”但是为了简单的布局 现在当用户按下“state_pressed”时选择器不适
我很难改变 Angular 2 Material 的前景颜色。例如在工具栏中,文本是黑色的。我尝试用以下样式更改它 @import '~@angular/material/theming'; $pri
我有一个奇怪的案例。我的 swift ios 应用程序已连接到 Cloudkit。如果应用程序未运行(后台状态),我每次都会收到我的通知徽章和警报!如果应用程序正在运行,则不会收到任何通知!我知道它没
这个问题在这里已经有了答案: How to change Status Bar text color in iOS (59 个答案) How to change the status bar bac
我想知道是否可以更改共享元素过渡的 z 顺序?看: 我有一个带有图像的布局,它填满了整个屏幕。图片前面是一个显示图片标题的文本框。如果我点击文本框,将开始过渡到详细信息 Activity 。因此,我实
每当文本框获得焦点时,文本的边框和前景都会根据当前主题更改: 主题灯->边框:黑色,文字:白色,背景:透明 theme dark ->border:white, text:white, backgro
我最近开始熟悉 Web 应用程序开发并努力解决一个基本的 css 布局问题。 所需的布局是一个中心区域重叠几个背景元素。看这里: 此图像显示了所需的布局: 我也在 codepen 上破解过它: Cod
这是交易。我可以创建一个 ListBox 并为其设置样式。我可以编辑模板的副本,以便状态在 Expression Blend 3 中可用。我可以更改状态,以便在选择时修改行项目的背景颜色。但是由于 C
我可以通过这样做来改变 QImage 的背景: QPainter painter(&image); painter.setCompositionMode(QPainter::CompositionMo
我有一个为 iOS8 实现的共享扩展。该服务使用 OAuth 进行身份验证。我用于扩展的登录信息与容器应用共享。 问题是: 当我在扩展中时,然后应用程序切换到容器应用程序并注销,然后应用程序切换回包含
我有一个 WPF Canvas 项目,我从工具箱中将对象拖放到 Canvas 上。根据某些数据,其中一些对象应该闪烁或闪烁。我得到一个未处理的异常:无法在不可变对象(immutable对象)实例上设置
我是一名优秀的程序员,十分优秀!