Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到选项卡控件时,如何延迟加载视图模型属性?_C#_Wpf_Mvvm_Tabs - Fatal编程技术网

C# 绑定到选项卡控件时,如何延迟加载视图模型属性?

C# 绑定到选项卡控件时,如何延迟加载视图模型属性?,c#,wpf,mvvm,tabs,C#,Wpf,Mvvm,Tabs,我在我的WPF应用程序中使用MVVM,在主/详细类型场景中,我有一个搜索结果列表(主)。当用户选择结果时,我调用Refresh并传递数据库键以加载详细信息。详细信息是一个具有一些复杂属性的视图模型。每个属性都有一个项目列表(表示数据库中的数据)以及一些其他ICommand和属性 “我的视图”有一个选项卡控件,其中每个选项卡都显示这些复杂属性之一的数据。如果选择了用于查看数据的选项卡项(可见?),我只想加载复杂属性的列表(调用LoadItems()方法) 以下是一个简化示例: public cla

我在我的WPF应用程序中使用MVVM,在主/详细类型场景中,我有一个搜索结果列表(主)。当用户选择结果时,我调用Refresh并传递数据库键以加载详细信息。详细信息是一个具有一些复杂属性的视图模型。每个属性都有一个项目列表(表示数据库中的数据)以及一些其他ICommand和属性

“我的视图”有一个选项卡控件,其中每个选项卡都显示这些复杂属性之一的数据。如果选择了用于查看数据的选项卡项(可见?),我只想加载复杂属性的列表(调用LoadItems()方法)

以下是一个简化示例:

public class MyItem{
    public string Id{get;set;}
    public DateTime Timestamp{get;set;}
}

public class ComplexClass:INotifyPropertyChanged
{
    private Guid _key;
    private List<MyItem> _items;

    public string Name{get;set;}
    public List<MyItem> Items 
    {
        get{
            if (_items == null) LoadItems(_key);
            return _items;
        }
        set{
            if(Equals(value, _items) return;
            _item = value;
            OnPropertyChanged("Items");
        }
    }
    public void LoadItems(Guid key){
    ... //code to load Items from database based on the key.
    }
    public ComplexClass(string name, Guid key){
        Name = name;
        _key = key;
    }
}

public class MyViewModel:INotifyPropertyChanged
{
    private ComplexClass _currentItems;
    public ComplexClass CurrentItems 
    {
        get{return _currentItems;}
        set{
            if(Equals(value, _currentItems) return;
            _currentItem = value;
            OnPropertyChanged("CurrentItems");
        }
    }
    private ComplexClass _historyItems;
    public ComplexClass HistoryItems
    {
        get{return _historyItems;}
        set{
            if(Equals(value, _historyItems) return;
            _historyItems= value;
            OnPropertyChanged("HistoryItems");
        }
    }

    public void Refresh(Guid key){
        CurrentItems = new ComplexClass("Foo", key);
        HistoryItems = new ComplexClass("Bar", key);
    }
}
公共类MyItem{
公共字符串Id{get;set;}
公共日期时间时间戳{get;set;}
}
公共类ComplexClass:INotifyPropertyChanged
{
专用Guid_密钥;
私人物品清单;
公共字符串名称{get;set;}
公共清单项目
{
得到{
如果(_items==null)LoadItems(_key);
退货(物品);;
}
设置{
如果(等于(值,_项)返回;
_项目=价值;
不动产变更(“项目”);
}
}
公共void加载项(Guid键){
…//根据键从数据库加载项的代码。
}
公共ComplexClass(字符串名称、Guid键){
名称=名称;
_钥匙=钥匙;
}
}
公共类MyViewModel:INotifyPropertyChanged
{
私有ComplexClass _currentItems;
公共ComplexClass CurrentItems
{
获取{return\u currentItems;}
设置{
如果(等于(值,_currentItems)返回;
_currentItem=值;
OnPropertyChanged(“当前项目”);
}
}
私有ComplexClass _historyItems;
公共复杂类历史项
{
获取{return\u historyItems;}
设置{
如果(等于(值,_historyItems)返回;
_historyItems=值;
关于财产变更(“历史项目”);
}
}
公共无效刷新(Guid键){
CurrentItems=新的ComplexClass(“Foo”,键);
HistoryItems=新的ComplexClass(“条”,键);
}
}
下面是一些XAML示例(假设TabControl的DataContex是ViewModel的一个实例)

。。。
...
....
...
....
这是第一次使用。在选择“历史项目”选项卡之前,不会调用HistoryItems.Items获取程序

但是,如果我在ViewModel实例上调用Refresh,无论选择了哪个选项卡,它都会在CurrentItems和HistoryItems上调用Items getter

基本上,我只想通过加载所需的数据来提高性能。在大多数情况下,用户会滚动搜索结果(调用ViewModel.Refresh)查看当前项目或历史记录。我只想在用户更改选项卡时加载这两个内容


有没有办法在调用Refresh后,根据选择的选项卡,我只能调用CurrentItems或HistoryItems的LoadItems?

TabItem
元素上有一个
IsSelected
属性

在视图模型中创建两个
bool
属性。将同一属性绑定到两个
TabItem
元素的
IsSelected
属性

在所选选项卡的相应设置方法中调用
LoadItems()


希望能解决您的问题:-)

TabItem
元素上有一个
IsSelected
属性

在视图模型中创建两个
bool
属性。将同一属性绑定到两个
TabItem
元素的
IsSelected
属性

在所选选项卡的相应设置方法中调用
LoadItems()


希望这能解决您的问题:-)

这不是最优雅的解决方案,但我可以通过将IsSelected属性添加到ComplexClass来实现,因此我接受这个答案。我希望找到一种方法,使TabItem只刷新可见的绑定(在所选选项卡上).JeremyD通过刷新绑定,您的意思是仅使用现有的新数据刷新UI控件?如果是,则可以手动调用
OnPropertyChanged(“CurrentItems”)
而不是
LoadItems()
。我希望UI在每次调用ViewModel后启动对LoadItems的调用。刷新,但仅针对CurrentItems或HistoryItems,具体取决于所选的选项卡。我通过将IsSelected属性添加到ComplexClass中使其工作。然后,如果(\u items==null&&IsSelected)LoadItems(\u键),我将调用
在Items getter和IsSelected setter中。我想我只是希望TabItem中元素的绑定不会更新,除非选中该选项卡。这不是最优雅的解决方案,但我可以通过将IsSelected属性添加到ComplexClass来实现,所以我接受这个答案。我希望有一个y使选项卡项仅刷新可见的绑定(在所选选项卡上)。@JeremyD刷新绑定的意思是用现有的新数据刷新UI控件?如果是,则可以手动调用
OnPropertyChanged(“CurrentItems”)
而不是
LoadItems()
。我希望UI在每次调用ViewModel后启动对LoadItems的调用。刷新,但仅针对CurrentItems或HistoryItems,具体取决于所选的选项卡。我通过将IsSelected属性添加到ComplexClass中使其工作。然后,如果(\u items==null&&IsSelected)LoadItems(\u键),我将调用
在Items getter和IsSelected setter中。我想我只是希望TabItem中元素的绑定不会更新,除非选中该选项卡。
... 
<TabControl>
    <TabItem Header="Current Items"
        DataContext={Binding CurrentItems}>
        ...
        <ItemsControl ItemsSource={Binding Items}>
            ....
        </ItemsControl>
    </TabItem>
    <TabItem Header="History Items"
        DataContext={Binding HistoryItems}>
        ...
        <ItemsControl ItemsSource={Binding Items}>
            ....
        </ItemsControl>
    </TabItem>
</TabControl>