我想在我的wpf应用程序中使用颜色选择器,我在this codeproject页面上看到一个漂亮的颜色选择器。控件正常工作,直到我想将控件连接到视图模型。 我用这个viewmodel创建了一个小测试程序:
public class ColorViewModel : ViewModelBase
{
public ColorViewModel()
{
LineColor = Brushes.Yellow;
}
SolidColorBrush _brushColor;
public SolidColorBrush LineColor
{
get { return _brushColor; }
set
{
_brushColor = value;
RaisePropertyChanged(() => LineColor);
}
}
}
测试程序有一个文本框和颜色选择器控件:
<StackPanel Orientation="Horizontal">
<TextBlock Text="Please Select a Color" FontWeight="Bold" Margin="10"
Foreground="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged}"/>
<vw:ColorPickerControlView x:Name="ForeColorPicker" Margin="10"
CurrentColor="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged }"/>
</StackPanel>
在我的测试应用程序的主窗口的加载事件中,我将viewmodel设置为datacontext,如下所示:
DataContext = new ColorViewModel();
问题是我似乎无法将viewmodel的LineColor属性绑定到ColorPickerControlView的CurrentColor属性。 ColorPickerControlView的CurrentControl属性似乎没问题。构造函数如下所示:
public ColorPickerControlView()
{
this.DataContext = this;
InitializeComponent();
CommandBindings.Add(new CommandBinding(SelectColorCommand, SelectColorCommandExecute));
}
在UserControl的构造函数中有一行this.DataContext = this;我读到绑定依赖项属性是必要的。我将viewmodel设置为datacontext时是否覆盖此行,这就是为什么我无法绑定到CurrentColor属性?有没有解决方法?还是我犯了另一个错误?
答案 0 :(得分:8)
您认为UserControl的构造函数中的DataContext=this
短语是否优先于绑定到外部视图模型是正确的。它在this question中被讨论过。然而,这很容易解决。在UserControl的代码中只有一个DependencyProperty,xaml绑定到:CurrentColor。
这样做:
Name="Root"
属性添加到的UserControl标记
UserControl的xaml Background="{Binding
Path=CurrentColor}"
至:
Background="{Binding
ElementName=Root,
Path=CurrentColor}"
这应该就是它的全部内容。我写了一个概念证明,证明了上述情况。如果你愿意,我可以发布它,但上面的代码应该是你所需要的。
答案 1 :(得分:0)
两个绑定都必须将属性的值与设置进行冲突。尝试设置Mode=OneWay
<StackPanel Orientation="Horizontal">
<TextBlock Text="Please Select a Color" FontWeight="Bold" Margin="10"
Foreground="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>
<vw:ColorPickerControlView x:Name="ForeColorPicker" Margin="10"
CurrentColor="{Binding Path=LineColor, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay }"/>
</StackPanel>
答案 2 :(得分:0)
this.DataContext =这一行并不是真正需要的,因为你要用ViewModel的实例替换DataContext。您也不需要在Loaded事件处理程序上分配DataContext。只需在构造函数上设置它。您可以在调用InitializeComponent方法后设置它。
答案 3 :(得分:0)