Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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# 如何在框架模式MVVM中关联TreeView和DataGrid?_C#_Wpf_Mvvm_Treeview_Caliburn.micro - Fatal编程技术网

C# 如何在框架模式MVVM中关联TreeView和DataGrid?

C# 如何在框架模式MVVM中关联TreeView和DataGrid?,c#,wpf,mvvm,treeview,caliburn.micro,C#,Wpf,Mvvm,Treeview,Caliburn.micro,我使用Caliburn.Micro和a,希望在框架模式MVVM中与TreeView和DataGrid建立关系。TreeView具有层次结构,我希望它会突出显示,树项将成为DataGrid的itemsource。但是TreeView没有SelectedItem属性 我有两个模型合同和产品 pubcli class Contarct() { public Contract() { ProductItems = new BindableCollection<

我使用Caliburn.Micro和a,希望在框架模式MVVM中与TreeView和DataGrid建立关系。TreeView具有层次结构,我希望它会突出显示,树项将成为DataGrid的itemsource。但是TreeView没有SelectedItem属性

我有两个模型合同和产品

pubcli class Contarct()
{
public Contract()
        {
            ProductItems = new BindableCollection<Product>();
        }

        private string _contractName;
        private string _firmName;
        private BindableCollection<Product> _productItems;
} 

public class Prodcut()
{
    public Product()
        {

            Children = new BindableCollection<Product>();
        }

        private string _productName;
        private string _contractName;
        private string _serialNumber;
        private string _markNumber;
        private string _xrayNumber;
}
pubcli类Contarct()
{
公共合同()
{
ProductItems=新的BindableCollection();
}
私有字符串_contractName;
私有字符串_firmName;
私有BindableCollection\u productItems;
} 
公共类Prodcut()
{
公共产品()
{
Children=新的BindableCollection();
}
私有字符串“\u productName”;
私有字符串_contractName;
私有字符串_serialNumber;
私有字符串_markNumber;
私有字符串xrayNumber;
}
还有一个类ContractService

public class ContractService
{
  public ContractService()
        {
            Childrens = new BindableCollection<Product>
            {
                new Product{ProductName = "Comp1", SerialNumber = "SN123456", Children = null },

            };
            Products = new BindableCollection<Product>
            {
                new Product {ProductName = "Comp2", SerialNumber = "SN123456", Children = Childrens },

            };

            Contracts = new BindableCollection<Contract>
           {
               new Contract {ContractName = "Alfa" , ProductItems = Products},

           };

        }



//commands



 public void GetData(Action<BindableCollection<Contract>,Exception>callback)
    {
        callback(Contracts, null);
    }

    public void _addnewContract()
    {
        Contracts.Add(new Contract {ContractName = "Test" });
    }
    public void _removeContarct(Contract contr)
    {
        Contracts.Remove(contr);
    }
    public Contract FindContarct(Contract contr)
    {
        if (contr == null)
            return null;
        return Contracts.FirstOrDefault(Contracts => Contracts.ContractName == contr.ContractName);
    }

}
公共类合同服务
{
公共服务
{
Childrens=新的BindableCollection
{
新产品{ProductName=“Comp1”,SerialNumber=“SN123456”,Children=null},
};
产品=新的BindableCollection
{
新产品{ProductName=“Comp2”,SerialNumber=“SN123456”,Children=Childrens},
};
合同=新的BindableCollection
{
新合同{ContractName=“Alfa”,ProductItems=Products},
};
}
//命令
public void GetData(Actioncallback)
{
回调(合同,空);
}
public void_addnewContract()
{
添加(新合同{ContractName=“Test”});
}
公共无效_removeContarct(合同控制)
{
合同。移除(控制);
}
公共合同签订合同(合同控制)
{
如果(contr==null)
返回null;
返回Contracts.FirstOrDefault(Contracts=>Contracts.ContractName==contr.ContractName);
}
}
视图模型

public class MainViewModel : PropertyChangedBase
    {
        private readonly ContractService _contractService;
        public MainViewModel(ContractService contractService)
        {
            _contractService = contractService;
            _contractService.GetData(
                (items, error) =>
                {
                    contract = items;
                });    
        }
        public void contract_SelectedItemChanged(Contract sender, RoutedPropertyChangedEventArgs<object> e)
        {

            _contractService.FindContarct(sender);




        }
        public BindableCollection<Contract> contract { get; set; }

        public void AddNewContract()
        {
            _contractService._addnewContract();

        }
        public void RemoveContract()
        {
            _contractService._removeContarct(SelectedContract);
        }
        private Contract _selectedContract;
        public Contract SelectedContract
        {
            get { return _selectedContract; }
            set
            {
                _selectedContract = value;
                NotifyOfPropertyChange("SelectedContract");
                NotifyOfPropertyChange(() => CanRemoveContract);
            }
        }

        public bool CanRemoveContract
        {
            get
            {
                if (SelectedContract == null)
                    return false;
                var findContract = _contractService.FindContarct(SelectedContract);
                if (findContract == null)
                    return false;
                return true;
            }
        }
public类主视图模型:PropertyChangedBase
{
私有只读合同服务_合同服务;
公共主视图模型(ContractService ContractService)
{
_合同服务=合同服务;
_contractService.GetData(
(项目、错误)=>
{
合同=项目;
});    
}
public void contract\u SelectedItemChanged(contract sender,routedproperty changedeventargs e)
{
_contractService.FindContarct(发送方);
}
公共BindableCollection约定{get;set;}
public void AddNewContract()
{
_contractService._addnewContract();
}
公共无效删除合同()
{
_合同服务。\u删除CONTARCT(选定合同);
}
私人合同(选择合同);;
公共合同选择合同
{
获取{return\u selectedContract;}
设置
{
_选择合同=价值;
财产变更通知(“选定合同”);
财产变更通知(()=>可以解除合同);
}
}
公共图书馆可以解除合同
{
得到
{
如果(SelectedContract==null)
返回false;
var findContract=\u contractService.findContract(SelectedContract);
如果(findContract==null)
返回false;
返回true;
}
}



为什么您不能订阅TreeView的SelectedItemChanged事件并在那里更新您的DataGrid?您尝试了什么?如果您可以提供代码的相关部分,会容易得多。我添加了他们项目的示例。我尝试将DataGrid项资源=“{Binding ElementName=SelectedContract,Path=contract}”,我试图通过SelectedItemChanged,但都没有成功。强烈影响了一些编程经验
<Grid>
        <WrapPanel>
            <TreeView ItemsSource="{Binding contract}" MinWidth="200"  
                      cal:Message.Attach="[Event SelectedItemChanged]=[Action contract_SelectedItemChanged($this,$eventArgs)]" 
                      >
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type local:Contract}" ItemsSource="{Binding ProductItems}">
                        <TextBlock Text="{Binding ContractName}" />
                    </HierarchicalDataTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type local:Product}" ItemsSource="{Binding Children}">
                        <TextBlock Text="{Binding ProductName}" />
                    </HierarchicalDataTemplate>
                </TreeView.Resources>
            </TreeView>
            <DataGrid ItemsSource="{Binding contract}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedContract}" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding ContractName}" Header="Имя контракта" ></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding ProductName}" Header="Имя продукта" ></DataGridTextColumn>
                    <DataGridTextColumn></DataGridTextColumn>
                    <DataGridTextColumn></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
</Grid>