wpf 数据触发器绑定到视图模型属性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17357117/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
datatrigger binding to viewmodel property
提问by MikeDub
I'm trying to create a simple style data trigger that pulls it's binding value from a viewmodel property, as you can see below:
我正在尝试创建一个简单的样式数据触发器,它从 viewmodel 属性中提取它的绑定值,如下所示:
<StackPanel Name="stackTextPanel" Orientation="Horizontal" Margin="0,8,0,0">
<StackPanel.Style>
<Style TargetType="{x:Type StackPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="False">
<Setter Property="Margin" Value="0,8,0,0" />
</DataTrigger>
<DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="True">
<Setter Property="Margin" Value="0,48,0,0" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
I have also tried the variant
我也试过变种
Binding="{Binding Path=QuickDrawBarPinned}"
but this is still not working when I press the button that changes the QuickDrawBarPinnedproperty what am I doing wrong?
但是当我按下更改QuickDrawBarPinned属性的按钮时这仍然不起作用我做错了什么?
I've implemented the property as so:
我已经实现了这个属性:
private bool _quickDrawBarPinned = false;
/// <summary>
/// Indicates if the Quick Draw Bar is pinned (stuck) or unpinned (retractable)
/// </summary>
public bool QuickDrawBarPinned
{
get { return _quickDrawBarPinned; }
set
{
_quickDrawBarPinned = value;
OnPropertyChanged("QuickDrawBarPinned");
}
}
This is the method that implements the change control
这是实现变更控制的方法
public virtual void OnPropertyChanged(string propertyInfo)
{
App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo));
}
}
));
}
回答by blindmeis
I think you have to remove to local style for your margin
我认为你必须为你的利润移除本地风格
<StackPanel Name="stackTextPanel" Orientation="Horizontal">
<StackPanel.Style>
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Margin" Value="0,8,0,0" />
<Style.Triggers>
<DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="False">
<Setter Property="Margin" Value="0,8,0,0" />
</DataTrigger>
<DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="True">
<Setter Property="Margin" Value="0,48,0,0" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
回答by Jawahar
You may miss the Notification in property change. Please confirm whether your viewmodel implement the INotifyPropertyChanged,
您可能会错过属性更改中的通知。请确认您的视图模型是否实现了 INotifyPropertyChanged,
public class ViewModel : INotifyPropertyChanged
{
private bool quickDrawBarPinned;
public bool QuickDrawBarPinned
{
get { return quickDrawBarPinned; }
set { quickDrawBarPinned = value; RaisePropertyChanged("QuickDrawBarPinned"); }
}
public void RaisePropertyChanged(string propertyname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

