Xaml中的数据绑定出错

时间:2017-03-31 11:00:40

标签: c# wpf

I have tried data binding in WPF.
But it is showing few errors.Please help me.

我正在附加代码。我创建了一个简单的文本块并试图绑定该字符串。另外我想知道Windows.datacontext是如何工作的?在我的代码中,它给出了一个错误。请帮帮我。

Xaml code
<Window x:Class="Shweta.DataBinding"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataBinding" Height="300" Width="300">
    <Window.DataContext>
        <l:DataBinding />
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="54*" />
            <ColumnDefinition Width="224*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="59*" />
            <RowDefinition Height="202*" />
        </Grid.RowDefinitions>
        <Grid Grid.Column="1" Grid.Row="1">
            <TextBlock Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBlock1" Text="{Binding TextString, TargetNullValue=Test}" VerticalAlignment="Top" Width="68" />
        </Grid>
    </Grid>
</Window>

**Code behind**

namespace Shweta
{
    public partial class DataBinding : Window
    {
        public DataBinding()
        {
            InitializeComponent();
            Setupviewmodel();
        }
        private void Setupviewmodel
        {
            TextString="this worked";
        }
        public string TextString{get;set;}
    }
}

3 个答案:

答案 0 :(得分:0)

您没有正确指定DataContext,因为您尝试使用尚未声明的命名空间在XAML上进行设置。有关XAML名称空间的更多信息,请查看following link

在你的例子中,它将在xaml方面:

<Window x:Class="Shweta.DataBinding"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataBinding" Height="300" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="54*" />
            <ColumnDefinition Width="224*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="59*" />
            <RowDefinition Height="202*" />
        </Grid.RowDefinitions>
        <Grid Grid.Column="1" Grid.Row="1">
            <TextBlock Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBlock1" Text="{Binding TextString, TargetNullValue=Test}" VerticalAlignment="Top" Width="68" />
        </Grid>
    </Grid>
</Window>

在您的代码中:

namespace Shweta
{
    public partial class DataBinding : Window
    {
        public DataBinding()
        {
            InitializeComponent();
            this.DataContext = this;  // Pay attention to this line!
            Setupviewmodel();
        }

        private void Setupviewmodel()
        {
            TextString="this worked";
        }

        public string TextString{get;set;}
    }
}

与原始版本的不同之处在于,我没有在XAML上指定DataContext,而是在其背后的代码上指定。

可以将DataContext视为视图将从中检索信息的位置。如有疑问,请参阅此MSDN article,或者您可以了解MVVM pattern哪个是使用XAML的支柱。

答案 1 :(得分:0)

好的,首先要阅读错误消息...它清楚地表明l中没有定义XAML,但您仍尝试使用它:<l:DataBinding /> ..

通过在l

中声明XAML来解决此问题
<Window x:Class="Shweta.DataBinding"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:l="<your l declaration"/>

另一件事是你没有实现INotifyPropertyChanged所以你的价值无论如何都不会得到更新。

像这样实现:

public partial class DataBinding : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
    {
        if ( PropertyChanged != null )
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    string text;
    public string TextString
    {
        get { return text; }
        set { text = value; NotifyPropertyChanged(); }
    }

    public DataBinding()
        : base()
    {
        InitializeComponent();
        Setupviewmodel();
        // as @Nahuel Ianni stated, he has to set DataContext to CodeBehind
        // in order to be able to get bindings work 
        DataContext = this; // <-- only if not binded before
    }

    public void Setupviewmodel() // forgot to to place () 
    // produced error : `A get or set accessor expected`
    {
        TextString = "this worked";
    }
}

另一件事是,只有当你的代码与后面的代码不一致时才必须指定DataContext,所以你不需要这个部分:

<Window.DataContext>
    <l:DataBinding />
</Window.DataContext>

答案 2 :(得分:-2)

为了完成这项工作,您必须正确设置DataContext。我建议创建一个viewmodel类并绑定到它。此外,我在代码隐藏中初始化了绑定,因为缺少名称空间。你也可以在xaml中做到这一点。现在为了给你一些工作,试试这个代码隐藏:

public partial class DataBinding : Window
{
  public DataBinding()
  {
    InitializeComponent();
    DataContext = new DataBindingViewModel();
  }
}

public class DataBindingViewModel
{
  public DataBindingViewModel()
  {
    Setupviewmodel();
  }
  private void Setupviewmodel()
  {
    TextString = "this worked";
  }
  public string TextString { get; set; }
}

并将您的观点改为:

<Window x:Class="Shweta.DataBinding"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="DataBinding" Height="300" Width="300">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="54*" />
        <ColumnDefinition Width="224*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="59*" />
        <RowDefinition Height="202*" />
    </Grid.RowDefinitions>
    <Grid Grid.Column="1" Grid.Row="1">
        <TextBlock Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBlock1" Text="{Binding TextString, TargetNullValue=Test}" VerticalAlignment="Top" Width="68" />
    </Grid>
</Grid>

请注意,Text属性仅在初始化时设置。如果您希望在运行时使用DataBinding,则DataBindingViewModel必须实现INPC并在设置绑定的属性后抛出PropertyChanged事件。