绑定不适用于ViewModel

花园巨人

我想根据布尔值更改矩形的填充。我有以下课程。

扩展INotifyPropertyChanged的基类:

public class PropertyChangedBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

模型:

public class ChangingVariable : PropertyChangedBase
{
    public ChangingVariable()
    {
        Variable = true;
    }

    private bool _variable;

    public bool Variable
    {
        get
        {
            return _variable;
        }

        set
        {
            if (_variable.CompareTo(value) != 0)
            {
                _variable = value;
                OnPropertyChanged();
            }
        }
    }
}

ViewModel:

public class BooleanRectangleViewModel : PropertyChangedBase
{
    public ChangingVariable Model { get; set; }
}

这是我的看法,它不能正常工作(填充是灰色的):

xaml:

<UserControl.DataContext>
    <viewModels:BooleanRectangleViewModel x:Name="ViewModel"/>
</UserControl.DataContext>

<Rectangle x:Name="Rectangle">
    <Rectangle.Style>
        <Style TargetType="{x:Type Rectangle}">
            <Setter Property="Fill" Value="Gray" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Model.Variable}" Value="true">
                    <Setter Property="Fill" Value="GreenYellow" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>

CS:

public partial class BooleanRectangleView
{
    public BooleanRectangleView()
    {
        InitializeComponent();
        ViewModel.Model = new ChangingVariable();
    }
}

但是,当我更改它以使数据上下文是Model而不是ViewModel时,它可以工作(填充为绿色):

xaml:

<UserControl.DataContext>
    <models:ChangingVariable x:Name="ViewModel" />
</UserControl.DataContext>

<Rectangle x:Name="Rectangle">
    <Rectangle.Style>
        <Style TargetType="{x:Type Rectangle}">
            <Setter Property="Fill" Value="Gray" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Variable}" Value="true">
                    <Setter Property="Fill" Value="GreenYellow" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>

CS:

public partial class BooleanRectangleView
{
    public BooleanRectangleView()
    {
        InitializeComponent();
        ViewModel = new ChangingVariable();
    }
}

为什么在它们之间的ViewModel不起作用?

i

据我所知,当您在模板或样式中进行绑定时,最好使用RelativeSource我不太确定,但是您可以尝试:

<Rectangle x:Name="Rectangle">
    <Rectangle.Style>
        <Style TargetType="{x:Type Rectangle}">
            <Setter Property="Fill" Value="Gray" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding DataContext.Model.Variable, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="true">
                    <Setter Property="Fill" Value="GreenYellow" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>



更新

我对WPF / MVVM也很陌生,但是我想分享我在短短的两到三个月中学到的知识,这可能会帮助其他人解决绑定问题。

每当绑定不起作用时,最可能的原因是绑定引擎无法找到绑定源或源属性。实现INotifyPropertyChanged(或使用DependencyProperty)只是为绑定提供了一种在源属性的值更改时得到通知的方式。如果您删除该部分,则绑定将像在OneTime模式下一样起作用原因很简单-绑定引擎足够智能,可以知道它必须从source属性中获取值才能使目标属性起作用。

例如,您有<Border BorderBrush="{Binding MyBorderColor}" ....>当控件将要呈现自身时,该控件需要知道边框是什么颜色,否则它将无法继续呈现。绑定引擎被迫搜索source属性MyBorderColor如果绑定失败,则BorderBrush目标属性将不会获得值,这将导致Border使用任何默认值或继承的值。如果MyBorderColor未实现'INotifyPropertyChanged'也不是a DependencyProperty,则如果MyBorderColor在运行时某个时间更改值,则该值将不会反映在中BorderBrush,因为绑定引擎不知道source属性已更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Xamarin绑定不适用于ListView

来自分类Dev

WPF绑定不适用于类

来自分类Dev

WPF 绑定不适用于 ItemsControl

来自分类Dev

绑定不适用于用户实例

来自分类Dev

ViewModel和View之间的MvvmCross绑定不适用于按钮

来自分类Dev

Inherited = false不适用于viewModel中的field属性

来自分类Dev

ASP.NET MVC 分页不适用于 ViewModel

来自分类Dev

为什么绑定不适用于动画?

来自分类Dev

敲除绑定不适用于输入type =“ text”

来自分类Dev

jQuery的数据绑定不适用于Chrome

来自分类Dev

计算绑定不适用于单击(聚合物)

来自分类Dev

双向绑定不适用于Aurelia的引导选择

来自分类Dev

JavaScript绑定方法不适用于getter属性

来自分类Dev

模型绑定不适用于复杂对象

来自分类Dev

为什么角度绑定不适用于服务原语

来自分类Dev

MultiDataTrigger不适用于绑定路径条件

来自分类Dev

KnockoutJs-数据绑定不适用于新元素

来自分类Dev

ExtJS绑定不适用于键盘日期字段更改

来自分类Dev

AngularJs双向绑定不适用于Jquery插件

来自分类Dev

双向数据绑定不适用于表达式

来自分类Dev

如果绑定不适用于<select>,则将其剔除

来自分类Dev

Android数据绑定不适用于<merge>属性

来自分类Dev

自定义绑定动画不适用于foreach

来自分类Dev

动态绑定元素不适用于按键

来自分类Dev

数据绑定不适用于AngularJS中的JSON

来自分类Dev

JavaScript:函数绑定不适用于调用者

来自分类Dev

数据绑定不适用于约束布局组

来自分类Dev

SwiftUI绑定不适用于子层次结构

来自分类Dev

AngularJS绑定不适用于复杂对象数组