数据绑定和图像帮助

多杰

活跃成员
已加入
2014年3月23日
留言内容
33
编程经验
1-3
我花了一天的时间对此进行阅读,最后得到了一些将图像路径绑定到绑定源的代码的有效示例。

问题是,我第一次加载时只能设置一次。之后,我无法将图像更改为其他图像。我想这与我更改inotifyproperty的实现有关,但是所有内容都可以编译并且可以正常运行且没有错误。

请有人可以看看我的代码并提出我要去哪里的错误吗?

C#:
<Window x:Class="Introduction_to_WPF_Data_Binding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Introduction_to_WPF_Data_Binding"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Image x:Name="image" Source="{Binding MyImagePath}" HorizontalAlignment="Left" Height="160" Margin="145,33,0,0" VerticalAlignment="Top" Width="224"/>
        <Button x:Name="btnImage1" Content="Image 1" HorizontalAlignment="Left" Height="34" Margin="31,246,0,0" VerticalAlignment="Top" Width="75" Click="btnImage1_Click" />
        <Button x:Name="btnImage2" Content="Image 2" HorizontalAlignment="Left" Height="34" Margin="145,246,0,0" VerticalAlignment="Top" Width="75"/>
        <Button x:Name="btnImage3" Content="Image 3" HorizontalAlignment="Left" Height="34" Margin="256,246,0,0" VerticalAlignment="Top" Width="75"/>
        <Button x:Name="btnImage4" Content="Image 4" HorizontalAlignment="Left" Height="34" Margin="367,246,0,0" VerticalAlignment="Top" Width="75" />

    </Grid>
</Window>

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace Introduction_to_WPF_Data_Binding
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window 
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this; //Set Data Context

           path = "img1.jpg"; //Set Default Image

        }


           string path = ""; //Create empty string for image path


            public event PropertyChangedEventHandler PropertyChanged; //Event Handler for OnProperty Changed


            private void OnPropertyChanged(string property)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(property));
            }


            public string MyImagePath
            {
                get { return path; }
                set
                {
                    path = value;
                    OnPropertyChanged("MyImagePath");
                }
            }

        private void btnImage1_Click(object sender, RoutedEventArgs e)
        {
            path = "img4.jpg";
        }
    }

    }
 

多杰

活跃成员
已加入
2014年3月23日
留言内容
33
编程经验
1-3
谢谢约翰,我已经按照您的建议进行了工作。

类减速度之后冒号后面的属性/标识符是什么意思,还有其他哪些变化?

例如。

默认情况下,新窗口具有:

C#:
public partial class MainWindow : Window

而我要做的一件事情就是将其更改为

C#:
public partial class MainWindow : INotifyPropertyChanged

那么,除了“窗口”或“ INotifyPropertyChanged”之外,我还可以在其中添加其他什么功能(以访问其他功能)?

':Window'是什么意思/做..现在删除它并替换为'INotifyPropertyChanged'是什么使我无法访问某些由':window'启用的功能?

在这种情况下,与“完全”类相比,局部类又是什么?为什么我要一个又一个呢?


我是否需要对要使用绑定的窗口上的每个控件重复所有这些代码?您是否建议像这样手动操作或使用Prism之类的方法?
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
在此可以指定类继承和接口类型列表。 MainWindow用户代码是设计人员生成的局部类,设计人员代码已经将其定义为继承Window类,因此不需要。如果您既需要继承基类并实现一个或多个接口,则需要先设置基类并使用逗号列出接口。 (C#语言规范10.1.4)
 

多杰

活跃成员
已加入
2014年3月23日
留言内容
33
编程经验
1-3
谢谢。那么iNotifyPropertyChanged是一个接口吗?我可以通过在类的顶部添加它们来实现它们,如果需要多个,请用逗号分隔。

这些接口本身就是方法或类的类型,还是本身完全独立的实体?诸如iNotifyPropertyChanged之类的接口是c#或WPF的内置组件,还是特定于Visual Studio?

是否有某种可用的文档或所有接口的列表?
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
是的。是的。接口就像合同一样,当您有需要遵守的特定合同时就可以实现它们。接口是一种抽象,可以使不同的对象更容易进行通信,而无需了解彼此的具体情况。
INotifyPropertyChanged在.Net Framework库中定义。在MSDN Library中可以找到文档,使用Visual Studio中的“帮助”系统可以将您导向那里。
 

多杰

活跃成员
已加入
2014年3月23日
留言内容
33
编程经验
1-3
谢谢约翰。

wpf使用数据绑定和接口而不是传统方法做事的目的是什么……这真的是朝正确方向迈出的一步吗?对于不知情的人来说,看起来似乎是额外的代码行的巨大开销,这些代码行没有直接的业务收益。

基本上所有这一切:

C#:
public partial class MainWindow : INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this; //Set Data Context

           path = "img4.jpg"; //Set Default Image

        }


           private string path = ""; //Create empty string for image path


        public event PropertyChangedEventHandler PropertyChanged; //Event Handler for OnProperty Changed


        // Create the OnPropertyChanged method to raise the event
        protected void OnPropertyChanged(string path)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(path));
            }
        }


        public string MyImagePath
            {
                get { return path; }
                set
                {
                    path = value;           

                // Call OnPropertyChanged whenever the property is updated
                OnPropertyChanged("MyImagePath");

                }
            }

获得与此相同的输出:

C#:
imgtest.Source = new BitmapImage(new Uri("img4.jpg", UriKind.Relative));
i
前者的好处是否足以使其成为大多数项目的明确选择(如果是,那么呢?)还是一个项目需要满足真正特定的标准才能使所有额外的努力值得?
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
INotifyPropertyChanged与WPF毫无关系,它源于.Net 2.0,是提供属性更改通知的标准方法。无需涉及大量代码,只需一个事件和一个OnPropertyChanged方法,这只是一个复制粘贴。它仅对事件和引发事件同样有效,但是根据设计准则,使用受保护的On ... Changed方法是在.Net代码中实现事件的标准方法。

WPF也有自己的带有DependencyProperty的系统,并为此内置了通知,请参见 如何:实现依赖项属性
 
最佳 底部