将绑定源更改为另一个CLR对象

时间:2014-10-13 04:18:38

标签: c# wpf xaml

这主要是出于好奇心问题,希望能帮助我更好地理解绑定,XAML和扩展语法。

所以我只想将MainWindow中的绑定源更改为我在MainWindow中实例化的对象。

这是我的C#代码:

    public partial class MainWindow : Window, INotifyPropertyChanged
    {

        public MainWindow()
        {
            favclass myfavclass = new favclass();
            InitializeComponent();
            this.DataContext = this;
        }

        string _myString = "hello";
        public string MyString
        {
            get { return _myString; }
        }

        public event PropertyChangedEventHandler PropertyChanged;

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


    }

    public class favclass : INotifyPropertyChanged
    {
        int _myint = 34;
        public int MyInt
        {
            get { return _myint; }
            set { _myint = value; }
        }

        public event PropertyChangedEventHandler PropertyChanged;

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


    }


}

和我的XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" >
    <Grid>
        <TextBlock Height="50" Width="50" Text="{Binding MyString}"/>
        <TextBlock Height="50" Width="48" Margin="200,100,100,100" 
                   Text="{Binding Source=myfavclass, Path=MyInt}"/>

    </Grid>
</Window>

因此,您可以看到我想首先在主窗口中显示MyString属性。

然后我想从myfavclass对象中显示MyInt。但当然MyInt并没有出现。我已经尝试了我能想到的每一种变化。

我错过了什么XAML?为什么我没有工作的XAML?

由于

2 个答案:

答案 0 :(得分:1)

favclass myfavclass = new favclass();应该从init方法声明,或者你不会得到this.myfavclass实例

答案 1 :(得分:1)

Source=myfavclass这是错误的。 Source只能使用以下元素语法直接分配

<Binding>
   <Binding.Source>
       <!-- value here -->
   </Binding.Source>
</Binding>

或者您可以使用StaticResourceDynamicResoure或某些自定义MarkupExtension,如下所示:

Text="{Binding Source={StaticResource someKey}, Path=MyInt}"

或使用新功能{x:Reference}直接引用XAML中的某些命名元素:

Text="{Binding Source={x:Reference someName}, Path=MyInt}"

此外,myfavclass在代码后面被声明为局部变量。在XAML代码中无法使用(引用)。

你正在做一些叫做多视图模型的事情。如果是这样,您应该为您的控件提供多个DataContext。我更喜欢使用嵌套的视图模型。要实现这一点,您可以尝试修改MainWindow,如下所示:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        _myfavclass = new favclass();
        InitializeComponent();
        this.DataContext = this;
    }
    private readonly favclass _myfavclass;
    //we will use this property inside XAML code
    public favclass MyFavClass {
        get {
           return _myfavclass;
        }
    }
}

现在在XAML代码中,您可以将文本绑定到MyFavClass.MyInt,请注意DataContext隐式是绑定的来源,因此您只需指定Path

<TextBlock Height="50" Width="48" Margin="200,100,100,100" 
               Text="{Binding Path=MyFavClass.MyInt}"/>

使用MyInt未正确实施INotifyPropertyChanged(但我希望您已经知道)。