【问题标题】:Binding inside ListBox, need to updateListBox内部绑定,需要更新
【发布时间】:2013-09-10 08:06:53
【问题描述】:

我在我的应用程序中使用 Listbox。

<ListBox Name="lbMain">
   <ListBox.ItemTemplate>
     <DataTemplate>
        <Expander Header="{Binding Converter={StaticResource convCaption}, 
          Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" IsExpanded="True">
        <StackPanel>
          <TextBlock Text={Binding FirstName, Mode=TwoWay,
                                             UpdateSourceTrigger=PropertyChanged}>
          </TextBlock> 
           <TextBlock Text={Binding SecondName, Mode=TwoWay,   pdateSourceTrigger=PropertyChanged}>
          </TextBlock> 
        </StackPanel>
     </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

后面的代码

public MainWindow()
{
   MyModel myModel = new MyModel();
   lbMain.ItemSource = myModel;
}

这是模型

public class MyModel
{
   public string FirstName{get; set; }
   public string SecondName{get; set; }
}

这是转换器(convCaption)

  public object Convert(object value, Type targetType, object parameter ...)
  {
     MyModel model =(MyModel)value;
     return string.Format("This is {0}, {1}", Model.FirstName, ModelSecondName)
  }

一切正常。但是当我更改 FirstName 或 SecondName 时,我需要更改 Expander 中的 Header。如果我写 {Mode = TwoWay} 显示错误 - “需要路径”。我喜欢为 Expander 编写正确的绑定(以更新的标题)?

【问题讨论】:

  • 您应该先尝试正确绑定(最好在xaml中)...并且您只需要更改属性并引发(实现)PropertyChange。

标签: c# wpf binding listbox


【解决方案1】:

您需要在您的MyModel 类上实现INotifyPropertyChanged 接口。请参阅 MSDN 上的 INotifyPropertyChanged Interface 页面寻求帮助。此外,您实际上并不需要 Converter 来加入这两个名称...有一个更简单的方法...只需覆盖该类中的 ToString() 方法即可:

public override string ToString()
{
    return string.Format("This is {0}, {1}", FirstName, SecondName);
}

【讨论】:

  • 不必覆盖ToString(),您也可以只使用StringFormat并将其保存在xaml中,并在名称的两部分加上MultiBinding
  • 老兄,没有人必须覆盖ToString,但这绝对比MultiBinding的代码少。我知道我更喜欢使用哪个。 :)
  • 谢谢,但我不习惯使用 INotifyPropertyChanged
  • 如果你不想使用INotifyPropertyChanged接口,那么你可以忘记使用WPF......它不是真的是可选的。
  • 是的,你几乎可以使用dps来处理所有事情......虽然我不推荐它。确切地说,它是如何减少代码的?
【解决方案2】:

首先您的MyModel 需要实现INotifyPropertyChanged 并在每次FirstNameSecondName 发生变化时引发PropertyChanged 事件,如下所示:

public class MyModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

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

    private string _firstName;

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName == value) return;
            _firstName = value;
            OnPropertyChanged("FirstName");
        }
    }

    private string _secondName;

    public string SecondName
    {
        get { return _secondName; }
        set
        {
            if (_secondName == value) return;
            _secondName = value;
            OnPropertyChanged("SecondName");
        }
    }
}

然后你可以像这样使用MultiBindingStringFormat

<Expander>
    <Expander.Header>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{}This is {0} {1}">
                    <Binding Path="FirstName"/>
                    <Binding Path="SecondName"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Expander.Header>
</Expander>

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 2011-06-16
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多