【问题标题】:Simple class as a binding data source简单类作为绑定数据源
【发布时间】:2018-02-27 13:45:58
【问题描述】:

我创建了一个演示项目,在我的 MainWindow 和运行时创建的子对象之间进行双向数据绑定,该子对象从 UserControl 和 INotifyPropertyChanged 派生,顶部有一个 TextBox。我的来源是我的 MainWindow 上的私人 List<Byte>

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private List<Byte> buffer;

    public MainWindow()
    {
        Binding binding;
        binding = new Binding("Buffer");
        binding.ElementName = "window";
        binding.Mode = BindingMode.TwoWay;

        myEdit = new MyEdit();
        myEdit.SetBinding(MyEdit.BufferValueProperty, binding);
    }

    public List<Byte> Buffer
    {
        get
        {
            return this.buffer;
        }

        set
        {
            this.buffer = value;
            NotifyPropertyChanged("Buffer");
        }
    }

    private void NotifyPropertyChanged(String propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

现在我想在我的实际项目中实现它。但我的数据源不在 MainWindow 中,它在另一个没有 XAML 代码的简单类中。

public class SimpleClass: INotifyPropertyChanged
{
    private List<Byte> buffer;

    public event PropertyChangedEventHandler PropertyChanged;

    public SimpleClass()
    {
        this.buffer = new List<Byte>();

        Binding binding;
        binding = new Binding("Buffer");
        binding.ElementName = "?????????";
        binding.Mode = BindingMode.TwoWay;

        myEdit = new MyEdit();
        myEdit.SetBinding(MyEdit.BufferValueProperty, binding);
    }
}

我的问题是,我在哪里可以获得绑定的 ElementName?这种方式可以吗?

【问题讨论】:

  • 为什么不直接在xaml中绑定&lt;TextBox text=binding someproperty/&gt;
  • 在使用 WPF 时,您确实想使用 MVVM 模式。如果你不使用 MVVM,你很有可能会为自己创造更多的工作。这里似乎就是这种情况。正如@Eldho 指出的那样,使用 xaml 进行绑定要简单得多。
  • myEdit.SetBinding - 这不是 WPF 数据绑定应该使用的方式。您不应在源类(即视图模型)中创建和分配绑定。

标签: c# wpf data-binding


【解决方案1】:

而不是 ElementName 直接设置 Source。您还需要定义Buffer 属性。绑定不适用于字段。

public class SimpleClass: INotifyPropertyChanged
{
    private List<Byte> buffer;
    public List<Byte> Buffer { get { return buffer; } set { buffer = value; } }

    public event PropertyChangedEventHandler PropertyChanged;

    public SimpleClass()
    {
        this.buffer = new List<Byte>();

        Binding binding = new Binding("Buffer");
        binding.Source = this;
        binding.Mode = BindingMode.TwoWay;

        myEdit = new MyEdit();
        myEdit.SetBinding(MyEdit.BufferValueProperty, binding);
    }
}

【讨论】:

  • 更简单:public List&lt;Byte&gt; Buffer { get; } = new List&lt;Byte&gt;(); 无需支持字段。除此之外 INotifyPropertyChanged 毫无意义。 PropertyChanged 事件从不在这里触发。
  • @Clemens,我会创建 get-only 属性,但如果尝试更新属性,BindingMode.TwoWay 会崩溃。此外,并不是每个人都使用最新的 c# 版本
  • 好的,那么public List&lt;Byte&gt; Buffer { get; set; } = new List&lt;Byte&gt;(); 应该可以了。无论如何,整件事毫无意义。
  • 非常感谢。我想我对我的项目进行了返工
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
相关资源
最近更新 更多