【发布时间】:2019-08-06 04:37:46
【问题描述】:
我正在制作一个基于 MVVM 模式的 WPF 应用程序,其中用户单击树的项目(由颜色名称组成的超链接,具有相应前景的名称文本)以 更改整个窗口的背景。 我正在通过中继命令执行此操作,但 UI 在我正在编写命令的视图模型中是不可接受的。
XAML 中带有颜色名称的树:
<TreeView Name="tree" ItemSource="{Binding colorList, Mode=TwoWay}" Background="Transparent">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemSource={Binding Children}>
<TextBlock><Hyperlink Command={Binding ColorChangerCommand} Foreground={Binding Foreground} TextDecorations="None"><TextBlock Text={Binding Name}/></Hyperlink></TextBlock>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView>
我的视图模型中的命令:
public RelayCommand ColorChangerCommand{ get; set;}
public TreeViewModel() //Constructor of the View Model
{
ColorChangerCommand= new RelayCommand(ChangeColor);
}
public void ChangeColor(object sender)
{
this.Background= (sender as TreeViewItem).Foreground;
}
该命令在简单的代码隐藏中运行良好,但现在不在视图模型中。请帮忙?
【问题讨论】:
-
你能出示你的约束力声明吗?在 Xaml 中,您正在绑定前景,但在 ViewModel 中,属性被命名为 Background
-
@PraveenM Xaml 中的前景只是必须显示的文本的前景。例如,第一项是“RED”,其前景为红色。在 ViewModel 中的命令中,我得到了单击项目的前景,将其设置为窗口的背景。例如,如果点击红色,窗口的背景也会变成红色。
-
使用命令时,您在 ChangeColor 函数中获得的对象不是发送者。这仅适用于事件!您应该做的是查看 XAML 触发器,以便您可以按照 WPF 中处理的方式解决您的问题
-
我同意这有点像您所处的困境,但请考虑以下事项:从您的视图模型中返回一个字符串,即您想要的前景颜色,并在 UI 中使用转换器来创建
SolidColorBrush。希望这会有所帮助 -
应该有一个视图模型项类来表示单个TreeViewItem的数据。该类应该具有背景颜色的 Color 或 Brush 属性,该属性由命令修改。在 TreeView 的 ItemContainerStyle 中,将 TreeViewItem 的 Background 绑定到此视图模型属性。
标签: c# wpf mvvm binding command