1

我是 WPF 和数据绑定的新手,经过数小时的搜索和搜索 Stackoverflow,我无法找到一个全面的解决方案。我正在尝试使用 KinectWindow.xaml 上的数据绑定在 TextBlock 控件上显示文本:

 <TextBlock x:Name="InitText" 
            TextWrapping="Wrap" 
            Text="{Binding Source=ScanInitTextA, 
                           Path=ScanInitTextA, 
                           UpdateSourceTrigger=PropertyChanged}"

免费的 KinectWindow.xaml.cs 类具有以下属性:

string ScanInitText = "Preparing for Initial Scan.";    
 string ScanInitTextA
    { get { return (ScanInitText) ; }
        set { ScanInitTextA = value; }
    }

我做了很多尝试,要么直接从类绑定属性,要么从 xaml.xml 绑定属性。尝试做任何事情时,我通常会收到此错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'ScanInitTextA' property not found on 'object' ''String' (HashCode=1828304777)'. 
BindingExpression:Path=ScanInitTextA; 
DataItem='String' (HashCode=1828304777); 
target element is 'TextBlock' (Name='InitText'); 
target property is 'Text' (type 'String')

据我了解,在对象字符串中找不到 ScanInitTextA?

最后,我知道当我从不同的类(不是 KinectWindow.xaml.cs,通过引用 xaml 中的类并将绑定源更改为该类的名称)尝试类似方法时,数据绑定确实工作,但出于其他原因,我更愿意通过这门课来做。

提前致谢。:)

4

4 回答 4

0

尝试这个:

<TextBlock x:Name="InitText" 
                TextWrapping="Wrap" 
                Text="{Binding  Path=ScanInitTextA}"

错误消息说您试图ScanInitTextA在字符串对象本身上查找属性。我认为Sourcefor currentTextBlock之前已分配(可能为DataContext)。

于 2013-10-28T05:36:30.373 回答
0

你有没有尝试过

     <TextBlock x:Name="InitText" 
        TextWrapping="Wrap" 
        Text="{Binding  Path=ScanInitTextA, 
                       UpdateSourceTrigger=PropertyChanged}"
于 2013-10-28T05:36:43.637 回答
0

如果你把DataContext你的观点设置为自我,那么给予Source是错误的。只需将您的绑定更新为:

 <TextBlock x:Name="InitText" 
        TextWrapping="Wrap" 
        Text="{Binding Path=ScanInitTextA, 
                       UpdateSourceTrigger=PropertyChanged}"/>
于 2013-10-28T05:37:13.467 回答
0

更新

需要一种绑定到主窗口属性的方法。这是一种进行绑定的方法

<Window x:Name="KinectWindow"
        Title="My Kinect Show"
        ...>
    <TextBlock Text="{Binding ScanInitTextA, ElementName=KinectWindow}" />

请注意,如果您希望 ScanInitTextA 的值会被某些东西更改并且该更改需要自动显示,那么您仍然需要让 ScanInitTextA 执行属性更改通知。请参阅下面的#1 和#2。


坚持MVVM类型系统并将VM放在Window的数据上下文中的原始建议

  1. 首先,任何持有 ScanInitTextA 的类都需要实现 INotifyPropertyChanged并使 ScanInitTextA public
  2. 其次,通过将页面的数据上下文设置为具有 INotifyPropertyChanged 的​​类来完成更好的绑定方法。这样做是因为它将所有数据集中显示在一个位置,并且页面的数据上下文由所有控件继承,因此此时页面的每个控件都简单地绑定到属性名称。这是基本的 MVVM,其中 VM(视图模型)具有 INotifyPropertyChanged。

例子

我们想Members在列表框中的页面上显示字符串列表。最终我们的绑定将是 just {Binding Members}

查看模型

public class MainVM : INotifyPropertyChanged 
{
 
    private List<string> _Members;
 
    public List<string> Members 
    { 
        get { return _Members; }
        set { _Members = value; OnPropertyChanged(); } 
    }
    public MainVM()
    {
        // Simulate Asychronous access, such as to a db.
 
        Task.Run(() =>
                    {
                        Members = new List<string>() {"Alpha", "Beta", "Gamma", "Omega"};
                        MemberCount = Members.Count;
                    });
    }
    /// <summary>Event raised when a property changes.</summary>
    public event PropertyChangedEventHandler PropertyChanged;
 
    /// <summary>Raises the PropertyChanged event.</summary>
    /// <param name="propertyName">The name of the property that has changed.</param>
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
 
}
}

页面代码隐藏

   public partial class MainWindow : Window
    {
 
        public MainVM ViewModel { get; set; }
 
        public MainWindow()
        {
            InitializeComponent();
 
            // Set the windows data context so all controls can have it.
            DataContext = ViewModel = new MainVM();
 
        }
 
    }

带有绑定的页面 Xaml

   <ListBox Name="lbData"
                ItemsSource="{Binding Members}"
                SelectionMode="Multiple"
                Margin="10" />

这个例子取自我的博客文章:

Xaml:ViewModel 主页实例化和加载策略,更容易绑定。

于 2013-10-28T05:38:13.220 回答