【问题标题】:WPF Databinding, no clue why it isn't workingWPF数据绑定,不知道为什么它不起作用
【发布时间】:2014-06-10 08:52:12
【问题描述】:

在使用 wpf 数据绑定之前,我已经成功地将窗口项绑定到视图模型,几乎和我在这里所做的完全相同。

我有一个带有 XAML 的 GUI,用于我的 TextBlock 绑定,以根据系统状态更改颜色和文本;

<TextBlock 
    HorizontalAlignment="Left" Margin="200,359,0,0" TextWrapping="Wrap" 
    Text="{Binding Path=StateText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    VerticalAlignment="Top" Width="565" Height="84" 
    Background="{Binding Path=StateColour, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

我在我的 xaml.cs 中将 datacontext 设置为我的视图模型;

MobilityWelcomeViewModel mobilityWelcomeViewModel = new mobilityWelcomeViewModel();

public MobilityWelcome()
{
    InitializeComponent();
    this.DataContext = this.mobilityWelcomeViewModel;
}

我有这个构造函数,它通过指定的适配器写入我的数据模型;

public class MobilityWelcomeViewModel
{
    private bool State;
    private string _Text;
    private Brush _StateColour;
    BackgroundWorker StateWorker = new BackgroundWorker();
}

public ShellEMobilityWelcomeViewModel()
{
    this._ANMStateColour = Brushes.White;
    this.ANMStateWorker.DoWork += this.ANMStateWorker_DoWork;
    this.ANMStateWorker.RunWorkerCompleted += this.ANMStateWorker_RunWorkerCompleted;
    this.ANMStateWorker.RunWorkerAsync();
    this._ANMText = "Loading ANM State";

    IApplicationPointAdapter testWrite = AdapterFactory.Instance.GetApplicationPointAdapter();
        testWrite.WriteBinary("HMI.EV.SITE1.STATUS.CONTACTBREAKEROPEN", false);

}

在我的视图模型中,我有属性;

public Brush StateColour
{
    get { return this._StateColour; }
    set { this._StateColour = value; }
}

public string StateText
{
    get { return this._Text; }
    set { }
}

我有后台工作人员,我可以看到在调试中更改这些值。

我真的被难住了。整个绑定的东西表面上看起来很简单,所以,从我相当新的和可能幼稚的知识来看,我看不出我做错了什么。

提前致谢。 (我也改变了变量名来伪装我的项目,所以如果类似对象之间存在拼写差异,或者同样忽略它)

【问题讨论】:

    标签: c# wpf xaml data-binding textblock


    【解决方案1】:

    我认为您正在设置数据上下文,但没有在正确的位置初始化您的 ViewModel。

    只是为了仔细检查,您可以使用 Snoop 等工具来查看问题所在。

    您应该在构造函数中初始化您的 ViewModel

    如下所示。

    public MobilityWelcome()
        {
            InitializeComponent();
            mobilityWelcomeViewModel = new mobilityWelcomeViewModel();
            this.DataContext = this.mobilityWelcomeViewModel;
        }
    

    还要确保您正在实施 INotificationPropertyChanged。

    您的属性设置器应如下所示

    public Brush StateColour
        {
            get { return this._StateColour; }
            set { this._StateColour = value; 
                  OnPropertyChanged("StateColour");
                }
        }
    

    【讨论】:

    • 感谢您的评论,我实现了接口并将实例化移至构造函数。但是,没有效果。尽管我尝试使用文本框而不是文本块,并且可以与远程更改的视图模型参数一起使用。虽然只有文本会随着视图模型的变化而变化,但画笔不会
    • 很抱歉,我不确定我是否完全理解您的问题。但是我创建了一个带有 Brush 作为属性的示例项目,当我在视图模型中更改它时,它会更新文本块的背景。我要说的一件事是您正在尝试更改此行中私有属性的颜色 this._ANMStateColour = Brushes.White;你能把它改成公共财产吗?像 ANMSTateColour = Brushes.White,因为私有属性不会触发 OnPropertyChanged,甚至不会让 UI 知道其值已更改
    • 我找到了解决办法!我的 using 语句导入了错误类型的画笔。我将使用 System.Windows.Drawing 更改为使用 System.Windows.Media
    • @Krishna “私有属性不会触发 OnPropertyChanged”不是真的。它是否触发更改通知完全取决于 setter 方法的实现。也许您的意思是私有属性不能用作绑定的来源。
    • @MarkCorrigan 您通常不应该在 WPF 应用程序中使用任何 WinForms 的东西。从您的项目中删除对 System.Drawing 程序集的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2016-04-10
    • 2015-06-25
    • 2012-04-06
    • 2021-07-24
    相关资源
    最近更新 更多