c# - WPF TabControl 标题和内容没有更新?

标签 c# wpf data-binding user-interface tabcontrol

设置:我有一个带有 0...n 个选项卡的选项卡控件,每个选项卡都绑定(bind)到一个类:

class MyTabItem
{
    string Text {get; set;}
    int ID {get; set;}
    ISet<MyTabContent> Contents {get; set;}
}

Class MyTabContent
{
    int ID {get; set;}
    string Subtext {get; set;}
}

每个 tabitem 类在其集合中都有许多 tabcontent 类。 (整个事情都是通过 NHibernate 获取的)。

我尝试了很多方法来将 MyTabItem 的内容绑定(bind)到每个 tabcontrol 项的标题,并将 MyTabContent 的内容绑定(bind)到每个 tabcontrol 项内容中的数据网格。

我可以在选项卡中显示所有内容,但是每当我更改绑定(bind)类中的属性时,UI 都不会更新。我尝试调用 InvalidateVisual,尝试分派(dispatch)渲染事件,尝试绑定(bind)上的 UpdateTarget 和 UpdateSource(最后两个抛出异常)。我在我的 View 模型中实现了 INotifyPropertyChanged,甚至尝试手动使用 OnPropertyChanged("MyTabItem") 无济于事。

我真的不明白为什么当我更改绑定(bind)类中的属性时我的 tabcontrol 内容不会更新。我尝试了 2 种不同的绑定(bind)策略,要么在显示内容时起作用,但都不会在内容更改时更新。

我的 XAML 设置是:

<TabControl>
  <TabControl.ItemTemplate>
    <DataTemplate DataType="models:MyTabItem">
      <TextBlock Text="{Binding Text}" />
    </DataTemplate>
  </TabControl.ItemTemplate>
  <TabControl.ContentTemplate>
    <DataTemplate DataType="models:MyTabItem">
      <DataGrid ItemsSource="{Binding Contents}">
        <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding Path=Subtext}" />
        </DataGrid.Columns>
      </DataGrid>
    </DataTemplate>
  </TabControl.ContentTemplate>
</TabControl>

使用该 XAML 设置,我只需使用 tabcontrol.Items.Add(new MyTabItem) 将项目添加到 tabcontrol。

然后我尝试了另一个 XAML 设置,在该设置中我将 tabcontrol.Itemsource 绑定(bind)到代码隐藏中的 ObservableCollection。同样,如果绑定(bind)属性更改,选项卡内容不会更新:(

我还尝试在 ViewModel 中创建一个 CurrentItem 属性,并将其用作 Window.Resource,然后将 Tabcontrol 内容绑定(bind)到

{Binding Source={StaticResource CurrentItem}, Path=Text}

每当我更改选项卡时,我都会更新 View 模型中的 CurrentItem,但它也不会更新更改。

我几乎没有想法:(

最佳答案

您需要实现 INotifyPropertyChanged

请记住,.NET 4.5 中有一个新属性可以简化任务,请查看 here

这是一个示例,将其应用于您的两个类,列表需要变为 ObservableCollection :

private ObservableCollection<MyTabContent> _contents = new  ObservableCollection<MyTabContent>();
public ObservableCollection<MyTabContent> Contents { get { return _contents; } }

-

public class MyTabContent : INotifyPropertyChanged
{
    private int _id;
    int ID {
        get{ return _id; }
        set{ _id = value; OnPropertyChanged(); }
    }

    private string _subText;
    public string Subtext {
        get{ return _subText; }
        set{ _subText= value; OnPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    { 
        if (PropertyChanged!= null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

关于c# - WPF TabControl 标题和内容没有更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15665838/

相关文章:

wpf - 这是VM响应另一VM的属性更改的可接受方法吗?

wpf - 如何在 Blend 中将径向渐变的 X/Y 坐标数据绑定(bind)到鼠标光标的 X/Y 坐标?

c# - NHibernate : unexpected session trouble when persisting object

c# - 将 Pascal 'type' 转换为 C#

c# - 调用 COM 组件返回错误 HRESULT E_FAIL

c# - 如何在 WPF 中使用捏合功能同时启用滚动和缩放?

c# - 在 C# 中显示多行静态文本的最佳方式?

c# - WPF C#,从音频文件中获取信息

c# - 将 WPF 数据网格绑定(bind)到 List<List<object>>

html - 通过属性进行 polymer 数据绑定(bind)